Stream.takeWhile în Java

takeWhile ia elemente cât timp condiția e adevărată și se oprește la primul care nu o respectă; dropWhile le sare pe acestea.

Sintaxă
Stream<T> takeWhile(Predicate<? super T> conditie)
Stream<T> dropWhile(Predicate<? super T> conditie)

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 takeWhile ca pe un filter. Se oprește la primul element care nu respectă condiția, deci elementele de mai târziu nu mai sunt verificate.
  • Folosești takeWhile/dropWhile pe un Set obiș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.