Iterable.takeWhile în Kotlin

takeWhile ia elementele de la început cât timp condiția e adevărată; dropWhile le sare și întoarce restul.

Sintaxă
fun <T> Iterable<T>.takeWhile(conditie: (T) -> Boolean): List<T>
fun <T> Iterable<T>.dropWhile(conditie: (T) -> Boolean): List<T>

Ce face Iterable.takeWhile

takeWhile { ... } pornește de la primul element și îl ia cât timp condiția este adevărată. La primul element care nu o îndeplinește se oprește, chiar dacă mai târziu apar elemente care ar îndeplini-o. Aici diferă de filter.

dropWhile { ... } sare peste elementele de la început cât timp condiția este adevărată și întoarce totul de la primul element care nu o mai îndeplinește, până la final.

Parametri

Parametru Descriere
conditie Funcția verificată pe elemente, de la început, până la prima valoare false.

Ce returnează

O List<T> nouă.

Exemple

Exemplul 1: takeWhile față de filter

takeWhile se oprește la 12, deci nu mai ajunge la 3. filter verifică toate elementele.

fun main() {
    val temperaturi = listOf(2, 5, 8, 12, 3, 1)
    println(temperaturi.takeWhile { it < 10 })
    println(temperaturi.filter { it < 10 })
}

Rezultat

[2, 5, 8]
[2, 5, 8, 3, 1]

Exemplul 2: Sărirea liniilor goale de la început

dropWhile elimină doar liniile goale de la început; linia goală din mijloc rămâne (o vedem ca un rând cu > și nimic după).

fun main() {
    val linii = listOf("", "", "Dragă Ana,", "", "Ne vedem mâine.")
    val text = linii.dropWhile { it.isBlank() }
    println("Linii rămase: ${text.size}")
    text.forEach { println("> $it") }
}

Rezultat

Linii rămase: 3
> Dragă Ana,
> 
> Ne vedem mâine.

Exemplul 3: Bugetul ajunge până la un punct

Cumpărăm produsele în ordine cât timp totalul nu depășește 100 de lei. Totalul parțial îl calculăm cu runningFold.

fun main() {
    val preturi = listOf(30, 25, 40, 20, 15)
    val totaluri = preturi.runningFold(0) { acc, p -> acc + p }.drop(1)
    val cumparate = totaluri.takeWhile { it <= 100 }.size
    println("Putem cumpăra primele $cumparate produse: ${preturi.take(cumparate)}")
}

Rezultat

Putem cumpăra primele 3 produse: [30, 25, 40]

Greșeli frecvente

  • Folosești takeWhile ca pe un filter: se oprește la primul element care nu se potrivește, restul nu mai e verificat.
  • Lista nu e sortată și te aștepți ca takeWhile { it < 10 } să dea toate valorile mici. Sortează întâi sau folosește filter.

Comenzi înrudite

  • Iterable.take: take(n) întoarce primele n elemente, iar drop(n) întoarce tot ce rămâne după ce sari peste primele n.
  • Iterable.filter: Creează o listă nouă doar cu elementele care îndeplinesc condiția (filterNot: cu cele care nu o îndeplinesc).
  • List.takeLast: takeLast(n) întoarce ultimele n elemente ale listei, iar dropLast(n) lista fără ultimele n.
  • generateSequence: Creează o secvență în care fiecare element se calculează din cel anterior; se oprește când funcția întoarce null.