Ce face sequenceOf
O Sequence are aceleași funcții ca o listă (map, filter, take…), dar le execută altfel. La o listă, fiecare pas creează o listă intermediară întreagă. La o secvență, pașii sunt doar „notați”; nimic nu se calculează până nu ceri un rezultat final, iar atunci fiecare element trece prin toți pașii, unul după altul.
Operațiile care dau rezultatul (operații terminale) sunt de exemplu toList(), first(), sum(), count(), forEach. Sequence.toList() rulează toți pașii și adună rezultatul într-o listă.
Secvențele merită pentru lanțuri lungi de operații pe multe elemente, sau când te oprești devreme (first, take). Pentru colecții mici, listele obișnuite sunt la fel de bune și mai simple.
Parametri
| Parametru | Descriere |
|---|---|
elemente |
Valorile secvenței. |
Ce returnează
sequenceOf: o Sequence<T>. toList: o List<T> cu elementele calculate.
Exemple
Exemplul 1: Nimic nu rulează până la toList
Mesajele din map apar abia după linia „pornim”, când toList() cere rezultatul.
fun main() {
val preturi = sequenceOf(10, 25, 40)
val cuTva = preturi.map {
println("calculez TVA pentru $it")
it * 119 / 100
}
println("pornim")
println(cuTva.toList())
}
Rezultat
pornim
calculez TVA pentru 10
calculez TVA pentru 25
calculez TVA pentru 40
[11, 29, 47]
Exemplul 2: Ordinea pașilor: listă față de secvență
La listă se face întâi filter pentru toate elementele, apoi map. La secvență fiecare element trece prin ambii pași, iar first() se oprește la primul rezultat.
fun main() {
val note = listOf(5, 9, 10, 4)
println("Listă:")
val a = note.filter { println(" filter $it"); it >= 9 }.map { println(" map $it"); it * 10 }.first()
println("rezultat $a")
println("Secvență:")
val b = note.asSequence().filter { println(" filter $it"); it >= 9 }.map { println(" map $it"); it * 10 }.first()
println("rezultat $b")
}
Rezultat
Listă:
filter 5
filter 9
filter 10
filter 4
map 9
map 10
rezultat 90
Secvență:
filter 5
filter 9
map 9
rezultat 90
Greșeli frecvente
- Construiești o secvență și uiți operația terminală: pașii nu rulează niciodată, iar
println(secventa)afișează doar un obiect, nu elementele. - Parcurgi aceeași secvență de mai multe ori crezând că rezultatele sunt păstrate: fiecare operație terminală recalculează totul.
Comenzi înrudite
Iterable.asSequence: Transformă colecția într-o secvență leneșă: operațiile se fac element cu element, doar când e nevoie de rezultat.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.filter: Creează o listă nouă doar cu elementele care îndeplinesc condiția (filterNot: cu cele care nu o îndeplinesc).