In Kotlin is Sequence een luie sequentie die het mogelijk maakt om efficiënt met grote of zelfs potentieel oneindige datasets te werken. Operaties op Sequence (zoals map, filter) worden niet onmiddellijk uitgevoerd; in plaats daarvan wordt er een keten van acties opgebouwd, en de berekening vindt alleen plaats wanneer dat nodig is (bij een terminale operatie, zoals toList).
Waarom is dit belangrijk:
Codevoorbeeld:
val numbers = generateSequence(1) { it + 1 } .filter { it % 2 == 0 } .map { it * it } .take(5) .toList() println(numbers) // [4, 16, 36, 64, 100]
In dit voorbeeld worden alleen de eerste 5 elementen van de sequentie daadwerkelijk berekend, ondanks dat deze potentieel oneindig is.
Wanneer Sequence gebruiken:
Kun je garanderen dat operators zoals
mapenfilterin gewone collecties Kotlin ook lui zijn? Waarom?
Antwoord: Nee, de standaard collectieoperaties (List.map, List.filter, enz.) in Kotlin zijn strikt gulzig. Elke operatie creëert een tussenliggende collectie en verwerkt onmiddellijk alle elementen. Luiheid wordt alleen ondersteund bij het gebruik van Sequence.
Voorbeeld:
val data = listOf(1,2,3,4) val mapped = data.map { println("Mapping $it"); it * 2 } // Print onmiddellijk alle waarden
Verhaal
In een project dat grote CSV-bestanden (tot een gigabyte bij schrijven) verwerkt, werd de collectie eerst volledig in een List geladen, waarna chain map/filter werd toegepast. De applicatie ‘viel’ door OutOfMemory — het probleem werd opgelost door List te vervangen door Sequence, wiens map/filter geen enorme tussenliggende lijsten aanmaakte.
Verhaal
Een backend-service voor het aggregeren van rapporten uit meerdere databases accumuleerde eerst de zoekresultaten in een List en filterde vervolgens: de aanvragen werden traag, er waren lagproblemen bij GC. Vervangen door een generator + Sequence maakte het mogelijk om de gegevens on-the-fly te aggregeren, wat de vertragingen sterk verminderde.
Verhaal
Een gemigreerd Java-project gebruikte de standaard uitbreidingen van Kotlin (map, filter) zonder over te schakelen naar Sequence bij het werken met grote datastromen, in de veronderstelling dat de code lui werkte, zoals Java 8 streams. Deze fout leidde tot ernstige geheugenlekken en onverwachte crashes in productie.