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 cuIllegalArgumentException. 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.