El uso de takeWhile y dropWhile con Java 9 poco a poco se irá extendiendo . Con la llegada de Java 8 y el uso de streams muchas cosas han cambiado en la programación cotidiana de Java. Sin embargo quedaban algunas casuísticas que cubrir en cuanto a operadores. Java 9 añade dos operadores importantes takeWhile y dropWhile que permiten filtrar un conjunto de elementos mientras una condición determinada se cumpla o no se cumpla .Vamos a ver unos ejemplos sencillos partiendo de una lista sencilla y recorriéndola como Stream.
package com.arquitecturajava;
import java.util.Arrays;
import java.util.List;
public class Principal {
public static void main(String[] args) {
List<String> lista= Arrays.asList("hola","que","tal","estas","hoy","aqui");
lista.forEach(System.out::println);
}
}
El resultado lo podemos ver en la consola:
Hasta aquí todo correcto pero hay a veces que queremos seleccionar un conjunto de elementos mientras se cumpla una condición para ello podríamos hacer lo siguiente utilizando el operador takeWhile:
package com.arquitecturajava;
import java.util.Arrays;
import java.util.List;
public class Principal2 {
public static void main(String[] args) {
List<String> lista= Arrays.asList("hola","que","tal","estas","hoy","aqui");
lista.stream().takeWhile((s)->s.length()<5).forEach(System.out::println);
}
}
En este caso se seleccionan todos los elementos mientras que se cumpla la condición.
La consola los mostrará:
De igual forma podemos realizar la operación contraria y usar dropWhile.
La consola muestra el resultado:
Utilizando dropWhile y takeWhile
Acabamos de ver cómo funcionan ambos métodos pero a veces es difícil entender en que casuísticas podemos utilizarlos de forma clara. Vamos a ver un par de ejemplos , en el primero vamos a usar el método iterate de los Streams para construir un bucle for con ellas usando takeWhile.
package com.arquitecturajava;
import java.util.stream.IntStream;
public class Principal3 {
public static void main(String[] args) {
IntStream.iterate(0, i->i+1).takeWhile(i->i<10).forEach(System.out::println)
}
}
El resultado será:
Otra de las opciones muy comunes es combinar ambos para realizar una selección concreta de elementos . Imagenemos que disponemos de un fichero de texto con el siguiente contenido:
texto1 texto2 ************************* zona destacada ************************* texto3 texto4
Queremos imprimir por la consola el contenido dentro de los “**” la zona destacada. Con takeWhile y dropWhile es instantáneo.
package com.arquitecturajava;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Principal7 {
public static void main(String[] args) {
String nombreFichero = "hola.txt";
try (Stream<String> stream = Files.lines(Paths.get(nombreFichero))) {
stream
.dropWhile(s->!s.contains("*"))
.skip(1)
.takeWhile(s->!s.contains("*"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
En este caso el programa elimina todas la lineas hasta llegar a los “*” lee las lineas dentro de ellos y elimina todas las lineas que estén a continuación de ellos.
El resultado lo vemos en la consola:
El uso de takeWhile y dropWhile es importante en el manejo de java Streams.
Otros artículos relacionados:
- Java Stream String y Java 8
- Java 8 Lambda Expressions (I)
- Java Parallel Stream y rendimiento
- Java Streams






Excelente articulo y ejemplo claro para su implementación.
gracias 🙂
Buen artículo!
gracias 🙂