¿Cuales son los métodos más utilizados de un Java Predicate Interface? . Estamos muy acostumbrados a usar un predicado concreto para filtrar Streams . Muchas veces se nos olvida que el interface soporta varios métodos que aportan flexibilidad. Vamos a echarlos un vistazo . Para ello partiremos de una colección de Personas que queremos recorrer utilizando Streams.
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 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;
}
public Persona(String nombre, String apellidos, int edad) {
super();
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
}
}
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class Principal {
public static void main(String[] args) {
List<Persona> lista= new ArrayList<Persona>();
Persona p1= new Persona ("pepe","perez",20);
Persona p2= new Persona ("ana","perez",30);
Persona p3= new Persona ("gema","sanchez",40);
Persona p4= new Persona ("pedro","gomez",70);
lista.add(p1);
lista.add(p2);
lista.add(p3);
lista.add(p4);
}
}
Métodos Java Predicate Interface
Uno de los métodos más utilizados del interface es and() que permite unir dos predicados y que la condición se cumpla si ambos predicados son ciertos.
Predicate < Persona > predicado1 = p - > p.getEdad() > 18; Predicate < Persona > predicado2 = p - > p.getEdad() > 30; Predicate < Persona > predicado3 = predicado1.and(predicado2);
En este caso estamos fusionando el predicado1 y el predicado2:

De igual forma podemos usar la clausula or() que fusiona los predicados pero hace que se cumpla la condición si uno de los dos es cierto.
Predicate < Persona > predicado4 = p - > p.getEdad() > 65; Predicate < Persona > predicado5 = predicado4.or(predicado3);

Por último podemos modificar el predicado y añadir una negación de tal forma que se cumpla lo contrario:
Predicate < Persona > predicado4 = p - > p.getEdad() > 65; Predicate < Persona > predicado5 = predicado4.or(predicado3).negate();
Es momento de recorrer la lista de Personas e imprimir por pantalla los nombres de las que cumplen las condiciones:

Conclusiones
Predicate es uno de los interfaces que más vamos a utilizar manejando Streams conocerlo a detalle es importante. El soporte de sintaxis fluida los hace muy cómodos.
lista.stream().filter(predicado5).forEach(p -> System.out.println(p.getNombre())); de esta manera hice el recorrido pero hay un error en el codigo, se puede ubicar con ls imgenes <30
Hola.
Y si coloco así:
Predicate predicado3= p->p.getEdad()>18 && p.getEdad()<30;
No es correcto? Gracias
Hola Cecilio, te faltó poner el código que recorre la lista de personas e imprime.
Saludos
Gracias , muy didáctico
Me alegro que te haya sido útil 🙂