Lazy sequence is een speciale wrapper rond een collectie die het uitvoeren van berekeningen (filter, map, enz.) uitstelt tot het moment van directe toegang tot de elementen. Dit betekent dat de bewerkingen op de lazy sequence alleen worden berekend wanneer er toegang wordt gezocht tot hun resultaat (bijvoorbeeld bij het aanroepen van .forEach, .first, omzetten naar een array, enz.).
Wanneer te gebruiken:
Voorbeeld:
let numbers = Array(1...1_000_000) let lazyNumbers = numbers.lazy.map { $0 * 2 }.filter { $0 % 3 == 0 } let first = lazyNumbers.first // Slechts nu wordt de keten van operaties berekend voor het eerste passende element!
Valkuilen:
Wat is het verschil tussen het aanroepen van
.map { ... }en.lazy.map { ... }op een array?
Antwoord:
.map { ... } past de closure toe op elk element en retourneert onmiddellijk een nieuwe array, wat betekent dat alle elementen worden verwerkt en in het geheugen worden opgeslagen..lazy.map { ... } retourneert geen array, maar een lazy-sequence (wrapper), die de verwerking van elementen niet onmiddellijk uitvoert, maar pas wanneer je toegang tot ze hebt.Voorbeeld:
let a = Array(1...10) let eagers = a.map { $0 * 2 } // Array met 10 elementen let laziers = a.lazy.map { $0 * 2 } // LazySequence, die niet meteen resultaten bevat
Verhaal
In een groot project paste een ontwikkelaar een keten van meerdere aanroepen van map, filter, reduce toe op een enorme gegevensarray zonder .lazy. Dit leidde tot tijdelijke allocaties van grote arrays bij elke tussenstap, verhoogde het geheugengebruik bijna tot het dubbele en veroorzaakte crashes op sommige apparaten met beperkte RAM.
Verhaal
In een codeblok werd een lazy sequence gebruikt met een bijwerking in de interne closure (bijvoorbeeld een event verzenden of print binnen map/filter). De ontwikkelaar verwachtte dat deze operatie onmiddellijk zou worden uitgevoerd, maar het evenement vond helemaal niet plaats — omdat er nooit toegang was gezocht tot de elementen van de lazy sequence, en de code met het evenement helemaal niet werd aangeroepen. Als resultaat waren de logs en metrics onnauwkeurig.
Verhaal
Bij het verzamelen van statistieken van gegevens uit een grote database werd een lazy sequence gebruikt in combinatie met meerdere iteraties (bijvoorbeeld tweemaal first zochten en toen count telden). Elke iteratie over lazy sequence initieerde een volledige herberekening van de bewerkingen — wat leidde tot een verdubbeling van de vertraging en onnodige belasting van het systeem. Nadat het was vervangen door een gewone array was het probleem opgelost.