Conocer Java Pattern Predicate nos puede ayudar a simplificar la forma que tenemos de trabajar con Java Streams a la hora de realizar filtrados. Normalmente cuando realizamos filtrados dentro de un Stream nos encontramos con que usamos algún tipo de Java Predicate . Vamos a ver un ejemplo sencillo de como usar Java Pattern Predicate , supongamos que tenemos un Stream de números.
package com.arquitecturajava; import java.util.stream.Stream; public class Principal { public static void main(String[] args) { Stream<Integer> stream=Stream.of(1,5,7,9,8,2); stream.filter(item->item>5).forEach(System.out::println); } }
Es muy sencillo usar el high order function de filter y filtrar las notas que superan el 5 y son aprobados , si ejecutamos el código la consola los mostrará los valores mayores de 5.
Sin embargo existen situaciones que no son tan sencillas y que los valores pueden venir construidos de la siguiente forma.
package com.arquitecturajava; import java.util.stream.Stream; public class Principal2 { public static void main(String[] args) { Stream<Integer> stream=Stream.of(1,5,7,9,8,2); stream.filter(item->item>5).forEach(System.out::println); Stream<String> mistream=Stream.of("hola","4","6","7","estas","9"); } }
En este caso para obtener los valores numéricos tenemos que mezclar cadenas de texto y valores nunéricos que en este caso son cadenas de texto. ¿CÓmo podemos hacerlo? . Bueno una solución sencilla es usar expresiones regulares.
package com.arquitecturajava; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; public class Principal2 { public static void main(String[] args) { Stream<Integer> stream = Stream.of(1, 5, 7, 9, 8, 2); stream.filter(item -> item > 5).forEach(System.out::println); Pattern patron = Pattern.compile("\\d+"); Matcher cumple = patron.matcher("7"); System.out.println(cumple.matches()); } }
Con este código conseguimos a nivel de expresión regular validar que cumplimos con que el texto contiene uno o más digitos. Por lo tanto por la consola nos imprimirá true.
true
Nos queda combinarlo con el concepto de Predicate y Streams.
Java Pattern Predicate
Con Java 8 podemos realizar esta operación de forma muy sencilla ya que la clase Pattern aporta un método que convierte el patrón directamente en un predicate (Pattern.asPredicate) .
Así es muy sencillo convertir la expresión regular en un Predicado y utilizarla dentro de un Stream.
package com.arquitecturajava; import java.util.regex.Pattern; import java.util.stream.Stream; public class Principal3 { public static void main(String[] args) { Pattern patron=Pattern .compile("\\d+"); Stream<String> mistream=Stream.of("hola","4","6","7","estas","9"); mistream.filter(patron.asPredicate()) .map(Integer::parseInt) .filter(n->n>5) .forEach(System.out::println); } }
El resultado únicamente incluirá los valores superiores a 5 acabamos de usar un Java Pattern Predicate.
Acabamos de ver otro uso del API de Java 8 para simplificar el trabajo con Java Stream y Lambdas.
Otros artículos relacionados