Ce face Iterable.asSequence
Pe o listă, fiecare operație (map, filter) creează imediat o listă nouă cu toate rezultatele. Pe o secvență, operațiile se înlănțuie și se fac pentru un element pe rând, abia când ceri rezultatul cu o operație finală (toList(), first(), sum(), count()).
Avantajul apare la lanțuri lungi pe colecții mari sau când ai nevoie doar de câteva rezultate: cu first { ... } sau take(n) calculul se oprește devreme. Pentru colecții mici, listele obișnuite sunt la fel de bune și mai simple.
Ce returnează
O Sequence<T> care citește elementele colecției.
Exemple
Exemplul 1: Ordinea pașilor: listă față de secvență
Pe listă, map se aplică tuturor elementelor înainte de filter. Pe secvență, fiecare element trece prin tot lanțul, iar calculul se oprește când first găsește rezultatul.
fun main() {
val numere = listOf(1, 2, 3, 4, 5)
println("Listă:")
val a = numere.map { println(" map $it"); it * it }.first { it > 5 }
println("Rezultat: $a")
println("Secvență:")
val b = numere.asSequence().map { println(" map $it"); it * it }.first { it > 5 }
println("Rezultat: $b")
}
Rezultat
Listă:
map 1
map 2
map 3
map 4
map 5
Rezultat: 9
Secvență:
map 1
map 2
map 3
Rezultat: 9
Exemplul 2: Nimic nu se calculează fără operație finală
Variabila pregatit conține doar rețeta. Mesajele apar abia la toList().
fun main() {
val orase = listOf("Iași", "Cluj", "Arad")
val pregatit = orase.asSequence().map { println("procesez $it"); it.uppercase() }
println("Secvența e creată")
println(pregatit.toList())
}
Rezultat
Secvența e creată
procesez Iași
procesez Cluj
procesez Arad
[IAȘI, CLUJ, ARAD]
Exemplul 3: Primele rezultate dintr-o listă mare
Din un milion de numere ne trebuie doar primele trei pătrate perfecte pare. Secvența verifică doar cât e nevoie.
fun main() {
val numere = (1..1_000_000).toList()
var verificate = 0
val rezultat = numere.asSequence()
.onEach { verificate++ }
.map { it * it }
.filter { it % 2 == 0 }
.take(3)
.toList()
println(rezultat)
println("Elemente verificate: $verificate")
}
Rezultat
[4, 16, 36]
Elemente verificate: 6
Greșeli frecvente
- Construiești un lanț pe secvență și uiți operația finală: nu se întâmplă nimic. Termină cu
toList(),forEach,sum()etc. - Parcurgi aceeași secvență de mai multe ori: calculul se reface de fiecare dată. Salvează rezultatul cu
toList()dacă ai nevoie de el de mai multe ori.
Comenzi înrudite
sequenceOf: Creează o secvență: o colecție „leneșă” ale cărei operații se fac element cu element, doar când ceri rezultatul.generateSequence: Creează o secvență în care fiecare element se calculează din cel anterior; se oprește când funcția întoarce null.sequence: Construiește o secvență dintr-un bloc de cod care dă valori una câte una cu yield; codul se oprește și continuă la cerere.Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.Iterable.take: take(n) întoarce primele n elemente, iar drop(n) întoarce tot ce rămâne după ce sari peste primele n.