Ce face Iterable.onEach
onEach seamănă cu forEach, dar la final întoarce colecția pe care a fost apelat. Așa poți „privi” elementele la mijlocul unui lanț (de exemplu pentru un mesaj de jurnal) fără să-l întrerupi.
Pe o secvență, onEach este leneș: acțiunea rulează abia când lanțul este consumat, pe rând pentru fiecare element.
Parametri
| Parametru | Descriere |
|---|---|
actiune |
Funcția executată pentru fiecare element. |
Ce returnează
Aceeași colecție (același obiect).
Exemple
Exemplul 1: Jurnal la mijlocul lanțului
Vedem ce comenzi trec de filtru înainte să le transformăm.
fun main() {
val comenzi = listOf(120, 45, 300, 80)
val total = comenzi
.filter { it >= 80 }
.onEach { println("comandă acceptată: $it lei") }
.map { it * 0.9 }
.sum()
println("Total cu reducere: $total lei")
}
Rezultat
comandă acceptată: 120 lei
comandă acceptată: 300 lei
comandă acceptată: 80 lei
Total cu reducere: 450.0 lei
Exemplul 2: Modificarea elementelor modificabile
Elementele sunt obiecte cu proprietăți var. onEach le schimbă și întoarce aceeași listă.
class Cont(val titular: String, var sold: Double)
fun main() {
val conturi = listOf(Cont("Ana", 100.0), Cont("Ion", 250.0))
val dupaDobanda = conturi.onEach { it.sold *= 1.05 }
dupaDobanda.forEach { println("${it.titular}: ${it.sold}") }
println(dupaDobanda === conturi)
}
Rezultat
Ana: 105.0
Ion: 262.5
true
Greșeli frecvente
- Folosești
onEachla capătul lanțului fără să folosești rezultatul:forEachspune mai clar intenția.
Comenzi înrudite
Iterable.forEach: Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.Iterable.asSequence: Transformă colecția într-o secvență leneșă: operațiile se fac element cu element, doar când e nevoie de rezultat.