sequenceOf în Kotlin

Creează o secvență: o colecție „leneșă” ale cărei operații se fac element cu element, doar când ceri rezultatul.

Sintaxă
fun <T> sequenceOf(vararg elemente: T): Sequence<T>
fun <T> Sequence<T>.toList(): List<T>

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