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
takeWhileca pe unfilter: 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ștefilter.
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.