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 🙂