Ce face sequence
În blocul sequence { ... } scrii cod obișnuit (bucle, if-uri), iar fiecare yield(x) „dă” un element. Blocul nu rulează dintr-odată: rulează până la primul yield, apoi se oprește și așteaptă până când cineva cere următorul element.
Așa poți scrie generatoare complicate (șiruri de numere, combinații, parcurgeri) fără să le ții pe toate în memorie. yieldAll(lista) dă toate elementele unei colecții sau ale altei secvențe.
Blocul poate fi infinit (de exemplu while (true)), cu aceeași regulă ca la generateSequence: iei doar cât îți trebuie.
Parametri
| Parametru | Descriere |
|---|---|
bloc |
Codul care produce elementele cu yield și yieldAll. |
Ce returnează
O Sequence<T>.
Exemple
Exemplul 1: Șirul lui Fibonacci
Bucla este infinită, dar luăm doar primele 10 numere. Fiecare yield oprește blocul până la cererea următoare.
fun main() {
val fibonacci = sequence {
var a = 0
var b = 1
while (true) {
yield(a)
val c = a + b
a = b
b = c
}
}
println(fibonacci.take(10).toList())
}
Rezultat
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Exemplul 2: Orarul unei zile
Amestecăm yield și yieldAll. Mesajul „pregătesc pauza” apare abia când se cere elementul de după ore.
fun main() {
val program = sequence {
yield("08:00 Matematică")
yieldAll(listOf("09:00 Română", "10:00 Istorie"))
println(" (pregătesc pauza)")
yield("11:00 Pauză mare")
yield("11:30 Fizică")
}
println(program.take(2).toList())
println("---")
program.forEach { println(it) }
}
Rezultat
[08:00 Matematică, 09:00 Română]
---
08:00 Matematică
09:00 Română
10:00 Istorie
(pregătesc pauza)
11:00 Pauză mare
11:30 Fizică
Greșeli frecvente
- Te aștepți ca un
printlndin bloc să apară imediat ce creezi secvența. Codul rulează doar când se cer elemente. - Apelezi
yieldîn afara bloculuisequence(de exemplu într-o funcție obișnuită apelată din bloc): nu compilează.
Comenzi înrudite
generateSequence: Creează o secvență în care fiecare element se calculează din cel anterior; se oprește când funcția întoarce null.sequenceOf: Creează o secvență: o colecție „leneșă” ale cărei operații se fac element cu element, doar când ceri rezultatul.buildList: Construiește o listă, un map sau o mulțime pas cu pas într-un bloc, apoi o întoarce doar pentru citire.Iterable.asSequence: Transformă colecția într-o secvență leneșă: operațiile se fac element cu element, doar când e nevoie de rezultat.