Crear un Java 8 Predicate, és una de les operacions que més farem quan treballem amb expressions Lambda i Streams en Java 8. Què és un Predicat? , 1 Predicat és una interfície funcional que defineix una condició que un objecte determinat ha de complir. Per exemple és una Persona major de 20 anys?.
El Predicat disposa d’un únic mètode anomenat test que rep l’objecte i comprova si compleix la condició. Construirem en exemple recolzant-nos en la classe 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;}}
Anem a construir una llista de Persones per a més endavant aplicar un Predicat a sobre.
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);}}
Finalment convertirem la llista en un Stream de dades i la recorrerem:
lista.stream().forEach(new Consumer<Persona>() {@Overridepublic void accept(Persona p) {System.out.println(p.getNombre());}});
El resultat serà
pepe a angel a pepe
Java 8 Predicate
Hem recorregut la llista, crearem un Predicat que s’encarregui de definir una condició que permeti filtrar la llista.
Predicate<Persona> predicadoNombre = new Predicate<Persona>() {@Override public boolean test(Persona p) { return p.getNombre().equals("pepe"); }};
En aquest cas acabem de crear un Predicat que només compliran les persones que es diguin “pepe”. Fem servir la funció filter a nivell de Streams per passar aquest objecte Predicat i obligar que es filtri sobre la base de la condició que el Predicat defineix.
lista.stream().filter(predicadoNombre).forEach(p -> System.out.println(p.getApellidos()));
el resultat en pantalla serà:
El Stream s’ha recolzat en el Predicat per realitzar el filtrat i quedar-nos amb les Persones que es diuen “pepe”. Recordem que les interfícies funcionals es poden veure com expressions Lambda i la seva gestió és més senzilla.
És moment de convertir el nostre Java 8 Predicate a una expressió lambda per guanyar claredat:
lista.stream().filter(p -> p.getNombre().equals("pepe")).forEach(p -> System.out.println(p.getApellidos()));
El resultat serà idèntic:
Els Predicats de Java 8 són inprescindibles
Altres articles relacionats: Java Lambda Java Streams