Java Stream Filter y Predicates
Las opciones de Java Stream Filter son muy amplias pero para poder trabajar con ellas de
forma cómoda hay que entender el funcionamiento del interface Predicate a detalle. Vamos
a construir un ejemplo con una lista de libros que nos permite entender mejor como
funcionan los filtros. Para ello vamos a partir de los siguientes objetos.
CURSO JAVA 8
GRATIS
APUNTATE!!
package [Link];
import [Link];
import [Link];
public class Principal {
public static void main(String[] args) {
Libro l = new Libro("El señor de los anillos", "fantasia",
1100);
Libro l2 = new Libro("El Juego de Ender", "ciencia ficcion",
500);
Libro l3 = new Libro("La fundacion", "ciencia ficcion", 500);
Libro l4 = new Libro("Los pilares de la tierra", "historica",
1200);
List < Libro > lista = [Link](l, l2, l3, l4);
[Link]
Java Stream Filter y Predicates
[Link]()
.filter(libro - > [Link]() > 1000)
.map(libro - > [Link]())
.forEach([Link]::println);
Tenemos cuatro libros y acabamos de usar un filtro sencillo que nos selecciona los libros
que pasan de 1000 páginas utilizando un Predicate con una expresión lambda. El resultado
se imprime en la consola.
Java Stream Filter
El filtro funciona de forma correcta , pero no siempre queremos filtran usando una
expresión lambda de una forma directa ya que no tiene una gran capacidad de reutilización.
En muchos casos suele ser mejor tener alguna clase de apoyo que defina una serie de
expresiones lambda y predicados que nos ayuden y se reutilicen.
[Link]
Java Stream Filter y Predicates
Vamos a ver un par de ejemplos.
package [Link];
import [Link];
public class LibroUtils {
public static Predicate<Libro> filtroCategoria(String
categoria) {
return (Libro l) -> {
return [Link]().equals(categoria);
};
}
De esta forma podemos podemos reutilizar la expresión , y filtrar por la categoría que
deseemos:
[Link]
Java Stream Filter y Predicates
lista
.stream()
.filter([Link]("ciencia ficcion"))
.map(libro - > [Link]())
.forEach([Link]::println);
Sin embargo lo más habitual en muchos casos es generar expresiones funcionales complejas
y luego ligarlas a través de métodos de referencia . Por ejemplo algo como la siguiente
expresion.
package [Link];
import [Link];
public class LibroUtils {
public static Predicate < Libro > filtroCategoria(String
categoria) {
return (Libro l) - > {
return [Link]().equals(categoria);
};
}
public static boolean buenosLibros(Libro libro) {
Predicate < Libro > p1 = (Libro l) - >
[Link]().equals("ciencia ficcion");
Predicate < Libro > p2 = (Libro l) - >
[Link]().equals("fantasia");
Predicate < Libro > p3 = (Libro l) - > [Link]() > 1000;
Predicate < Libro > ptotal = [Link](p2).and(p3);
[Link]
Java Stream Filter y Predicates
return [Link](libro);
}
}
De esta forma nosotros podemos invocar este tipo de filtro y reutilizarlo.
lista
.stream()
.filter(LibroUtils::buenosLibros)
.map(Libro::getTitulo)
.forEach([Link]::println);
El resultado es:
Acabamos de usar Java Stream Filter y sus opciones.
CURSO SPRING BOOT
GRATIS
APUNTATE!!
Otros artículos relacionados:
1. Java Predicate Interface y sus métodos
2. Java Stream forEach y colecciones
3. Java 8 Lambda Expressions (I)
4. Oracle Java Lambda
[Link]
Java Stream Filter y Predicates
[Link]