Iterable.onEach în Kotlin

Execută o acțiune pentru fiecare element și întoarce aceeași colecție, ca lanțul de operații să continue.

Sintaxă
fun <T, C : Iterable<T>> C.onEach(actiune: (T) -> Unit): C

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 onEach la capătul lanțului fără să folosești rezultatul: forEach spune 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.