import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/** Métodos de las colecciones que reciben lambdas: removeIf, forEach, merge, computeIfAbsent. */
public class CollectionLambdasDemo {

    public static void main(String[] args) {
        List<Song> songs = Songs.sample();
        songs.removeIf(s -> s.seconds() < 200);    // sin iterador ni ConcurrentModificationException
        songs.forEach(s -> IO.println("queda: " + s.title()));

        // Contar palabras (semana 11) con merge: si no está, pone 1; si está, suma.
        Map<String, Integer> counts = new TreeMap<>();
        for (String w : "la garúa cae en lima en lima la garúa no moja".split(" ")) {
            counts.merge(w, 1, Integer::sum);
        }
        IO.println(counts);

        // Índice de artista a títulos con computeIfAbsent: crea la lista la primera vez.
        Map<String, List<String>> byArtist = new TreeMap<>();
        for (Song s : Songs.sample()) {
            byArtist.computeIfAbsent(s.artist(), k -> new ArrayList<>()).add(s.title());
        }
        byArtist.forEach((artist, titles) -> IO.println(artist + " -> " + titles));
    }
}
