Ce face Stream.takeWhile
takeWhile(conditie) păstrează elementele de la început atât timp cât condiția este adevărată. La primul element care nu o respectă, stream-ul se oprește, chiar dacă mai târziu ar apărea elemente care o respectă. Spre deosebire de filter, poate opri un stream infinit.
dropWhile(conditie) face invers: sare peste elementele de la început cât timp condiția este adevărată și le păstrează pe toate de la primul element care nu o mai respectă.
Cele două au sens mai ales pe date ordonate (o listă sortată, valori care cresc). Pe un stream fără ordine, rezultatul nu este garantat.
Parametri
| Parametru | Descriere |
|---|---|
conditie |
Condiția verificată pentru elementele de la început. |
Ce returnează
Un stream cu partea de început (takeWhile) sau cu restul (dropWhile).
Exemple
Exemplul 1: Diferența față de filter
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> temperaturi = List.of(12, 15, 18, 25, 14, 22, 9);
System.out.println("filter < 20: " + temperaturi.stream().filter(t -> t < 20).toList());
System.out.println("takeWhile < 20: " + temperaturi.stream().takeWhile(t -> t < 20).toList());
System.out.println("dropWhile < 20: " + temperaturi.stream().dropWhile(t -> t < 20).toList());
}
}
Rezultat
filter < 20: [12, 15, 18, 14, 9]
takeWhile < 20: [12, 15, 18]
dropWhile < 20: [25, 14, 22, 9]
Exemplul 2: Oprirea unui stream infinit
Sumele economisite cresc lunar; ne oprim când trecem de 1500 de lei.
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream.iterate(1000.0, s -> s * 1.1)
.takeWhile(s -> s < 1500)
.forEach(s -> System.out.printf("%.2f%n", s));
}
}
Rezultat
1000.00
1100.00
1210.00
1331.00
1464.10
Exemplul 3: Sari peste comentariile de la începutul unui fișier
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> fisier = List.of("# setări", "# autor: Ana", "port=8080", "# notă", "limba=ro");
fisier.stream()
.dropWhile(r -> r.startsWith("#"))
.forEach(System.out::println);
}
}
Rezultat
port=8080
# notă
limba=ro
Greșeli frecvente
- Folosești
takeWhileca pe unfilter. Se oprește la primul element care nu respectă condiția, deci elementele de mai târziu nu mai sunt verificate. - Folosești
takeWhile/dropWhilepe unSetobișnuit (fără ordine). Rezultatul poate diferi de la o rulare la alta.
Comenzi înrudite
Stream.limit: limit păstrează doar primele n elemente, iar skip sare peste primele n.Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.Stream.iterate: Creează un stream din formule: iterate pornește de la o valoare și aplică un pas, generate cere fiecare valoare unui Supplier.Predicate: O condiție: primește o valoare și răspunde true sau false prin metoda test; folosită de filter, removeIf, anyMatch.