Iterable.chunked în Kotlin

Împarte colecția în bucăți consecutive de câte n elemente; ultima bucată poate fi mai mică.

Sintaxă
fun <T> Iterable<T>.chunked(marime: Int): List<List<T>>
fun <T, R> Iterable<T>.chunked(marime: Int, transformare: (List<T>) -> R): List<R>

Ce face Iterable.chunked

chunked(n) taie colecția în bucăți (liste) de câte n elemente, în ordine, fără suprapuneri. Dacă numărul de elemente nu se împarte exact, ultima bucată are mai puține elemente.

A doua formă aplică direct o funcție pe fiecare bucată (de exemplu suma ei), așa că obții o listă de rezultate în loc de o listă de liste.

Este utilă pentru paginare, pentru afișarea pe rânduri sau pentru trimiterea datelor în loturi. Pentru bucăți care se suprapun (ferestre glisante) folosește windowed.

Parametri

Parametru Descriere
marime Câte elemente are fiecare bucată; trebuie să fie mai mare decât 0.
transformare Opțional: funcția aplicată fiecărei bucăți.

Ce returnează

O List<List<T>> cu bucățile, sau List<R> cu rezultatele transformării.

Exemple

Exemplul 1: Elevi împărțiți în echipe de câte 3

Sunt 8 elevi, deci avem două echipe de 3 și o echipă de 2.

fun main() {
    val elevi = listOf("Ana", "Ion", "Maria", "Radu", "Elena", "Dan", "Ioana", "Mihai")
    elevi.chunked(3).forEachIndexed { i, echipa ->
        println("Echipa ${i + 1}: $echipa")
    }
}

Rezultat

Echipa 1: [Ana, Ion, Maria]
Echipa 2: [Radu, Elena, Dan]
Echipa 3: [Ioana, Mihai]

Exemplul 2: Paginare: pagina a doua

Cu 4 rezultate pe pagină, chunked(4) dă paginile, iar indexul 1 este a doua pagină.

fun main() {
    val produse = (1..10).map { "Produs $it" }
    val pagini = produse.chunked(4)
    println("Pagini: ${pagini.size}")
    println("Pagina 2: ${pagini[1]}")
}

Rezultat

Pagini: 3
Pagina 2: [Produs 5, Produs 6, Produs 7, Produs 8]

Exemplul 3: Cu transformare: total pe trimestru

Vânzările sunt pe 12 luni; luăm bucăți de 3 și le adunăm direct, obținând totalul pe fiecare trimestru.

fun main() {
    val vanzari = listOf(10, 12, 9, 15, 18, 20, 25, 24, 16, 11, 13, 30)
    val trimestre = vanzari.chunked(3) { it.sum() }
    println(trimestre)
}

Rezultat

[31, 53, 65, 54]

Greșeli frecvente

  • Dai chunked(0): programul se oprește cu IllegalArgumentException. Mărimea trebuie să fie pozitivă.
  • Presupui că toate bucățile au aceeași mărime: ultima poate fi mai mică.

Comenzi înrudite

  • Iterable.windowed: Întoarce „ferestre” de câte n elemente consecutive care alunecă peste colecție, de exemplu pentru medii mobile.
  • Iterable.partition: Împarte colecția în două liste: elementele care îndeplinesc condiția și cele care nu o îndeplinesc.
  • Iterable.take: take(n) întoarce primele n elemente, iar drop(n) întoarce tot ce rămâne după ce sari peste primele n.
  • List.slice: Întoarce o listă nouă cu elementele de la pozițiile date: un interval (2..4) sau o listă de indici.