Iterable.flatMap în Kotlin

flatten unește o listă de liste într-o singură listă; flatMap transformă fiecare element într-o listă și le unește.

Sintaxă
fun <T, R> Iterable<T>.flatMap(transformare: (T) -> Iterable<R>): List<R>
fun <T> Iterable<Iterable<T>>.flatten(): List<T>

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 map când funcția întoarce o listă și obții List<List<T>>. Dacă vrei o singură listă, folosește flatMap.

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.