Ce face Iterable.flatMap
flatten() ia o colecție de colecții (de exemplu List<List<Int>>) și pune toate elementele interioare, în ordine, într-o singură listă. Spunem că „aplatizează” lista.
flatMap { ... } face map și flatten într-un pas: funcția ta întoarce, pentru fiecare element, o listă (sau altă colecție), iar rezultatele se lipesc una după alta. Este utilă când fiecare element are mai multe „copii”: o clasă are mai mulți elevi, o comandă are mai multe produse.
Parametri
| Parametru | Descriere |
|---|---|
transformare |
Funcția care întoarce o colecție pentru fiecare element. |
Ce returnează
O singură List<R> cu toate elementele.
Exemple
Exemplul 1: flatten: notele tuturor elevilor
Fiecare elev are o listă de note; flatten() le pune pe toate într-o listă.
fun main() {
val note = listOf(listOf(9, 10), listOf(7), listOf(8, 6, 10))
val toate = note.flatten()
println(toate)
println("Media clasei: ${toate.average()}")
}
Rezultat
[9, 10, 7, 8, 6, 10]
Media clasei: 8.333333333333334
Exemplul 2: flatMap: produsele din toate comenzile
Fiecare comandă are mai multe produse. flatMap dă lista tuturor produselor; map ar fi dat o listă de liste.
data class Comanda(val client: String, val produse: List<String>)
fun main() {
val comenzi = listOf(
Comanda("Ana", listOf("pâine", "lapte")),
Comanda("Ion", listOf("cafea")),
Comanda("Maria", listOf("lapte", "ouă", "unt")),
)
println(comenzi.map { it.produse })
println(comenzi.flatMap { it.produse })
println(comenzi.flatMap { it.produse }.toSet())
}
Rezultat
[[pâine, lapte], [cafea], [lapte, ouă, unt]]
[pâine, lapte, cafea, lapte, ouă, unt]
[pâine, lapte, cafea, ouă, unt]
Exemplul 3: flatMap pentru combinații
Pentru fiecare mărime creăm o listă cu toate culorile, apoi le unim: toate combinațiile posibile.
fun main() {
val marimi = listOf("S", "M")
val culori = listOf("roșu", "negru", "alb")
val variante = marimi.flatMap { m -> culori.map { c -> "$m-$c" } }
println(variante)
println("${variante.size} variante")
}
Rezultat
[S-roșu, S-negru, S-alb, M-roșu, M-negru, M-alb]
6 variante
Greșeli frecvente
- Folosești
mapcând funcția întoarce o listă și obțiiList<List<T>>. Dacă vrei o singură listă, foloseșteflatMap.
Comenzi înrudite
Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.Iterable.groupBy: Împarte elementele în grupe după o cheie și întoarce un map: cheie → lista elementelor din acea grupă.Iterable.zip: zip pune față în față elementele a două colecții, pe aceeași poziție; unzip desparte o listă de perechi în două liste.