Crear un Java 8 Predicate , es una de las operaciones que más realizaremos cuando trabajemos con expresiones Lambda y Streams en Java 8. ¿Qué es un Predicado? , un Predicado es un interface funcional que define una condición que un objeto determinado debe cumplir . ¿Por ejemplo es una Persona mayor de 20 años?.
El Predicado dispone de un único método denominado test que recibe el objeto y comprueba si cumple la condición. Vamos a construir en ejemplo apoyándonos en la clase Persona.
package com.arquitecturajava; public class Persona { private String nombre; private String apellidos; private int edad; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Persona(String nombre, String apellidos, int edad) { super(); this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } }
Vamos a construir una lista de Personas para más adelante aplicar un Predicado sobre ella.
public class Principal { public static void main(String[] args) { List<Persona> lista = new ArrayList<>(); Persona p1 = new Persona("pepe", "perez", 20); Persona p2 = new Persona("angel", "sanchez", 30); Persona p3 = new Persona("pepe", "blanco", 40); lista.add(p1); lista.add(p2); lista.add(p3); } }
Finalmente convertiremos la lista en un Stream de datos y la recorreremos:
lista.stream().forEach(new Consumer<Persona>() { @Override public void accept(Persona p) { System.out.println(p.getNombre()); } });
El resultado será
pepe
angel
pepe
Java 8 Predicate
Hemos recorrido la lista , vamos a crear un Predicado que se encargue de definir una condición que permita filtrar la lista.
Predicate<Persona> predicadoNombre = new Predicate<Persona>() { @Override public boolean test(Persona p) { return p.getNombre().equals("pepe"); } };
En este caso acabamos de crear un Predicado que solo cumplirán las personas que se llamen “pepe”. Usamos la función filter a nivel de Streams para pasar este objeto Predicado y obligar a que se filtre en base a la condición que el Predicado define.
lista.stream().filter(predicadoNombre).forEach(p -> System.out.println(p.getApellidos()));
El resultado en pantalla será:
El Stream se ha apoyado en el Predicado para realizar el filtrado y quedarnos con las Personas que se llaman “pepe” . Recordemos que los interfaces funcionales se pueden ver como expresiones Lambda y su gestión es más sencilla.
Es momento de convertir nuestro Java 8 Predicate a una expresión lambda para ganar claridad:
lista.stream() .filter(p -> p.getNombre().equals("pepe")) .forEach(p -> System.out.println(p.getApellidos()));
El resultado será idéntico:
Otros artículos relacionados:
Buenas se ve codigo extraño incrustado en el codigo
List<Persona> lista =
new
ArrayList<>();
Al final un Predicate es una expresión Lambda porque es una Interfaz funcional?
Basicamente sí
Gracias por tomarte el tiempo para subir esta información, tendrás algún canal de Youtube?
Estoy pensando en retomarlo en enero 🙂 por ahora no tengo casi nada em youtube
Muchas Gracias Cecilio, Me encantan todos tus tutoriales.
gracias:)
Muy bueno. Gracias por compartir! un saludo
de nada 🙂