Java Stream Opções de filtro é muito amplo, mas para trabalhar com eles confortavelmente, você precisa entender a operação da interface de pregação em detalhes. Vamos construir um exemplo com uma lista de livros que nos permite entender melhor como os filtros funcionam. Para isso, vamos a partir dos seguintes objetos.
package com.arquitecturajava;import java.util.Arrays;import java.util.List;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 = Arrays.asList(l, l2, l3, l4); lista.stream() .filter(libro - > libro.getPaginas() > 1000) .map(libro - > libro.getTitulo()) .forEach(System.out::println); }}
Temos quatro livros e acabamos de usar um filtro simples que nos seleciona os livros que passam 1000 páginas usando um predicado com uma expressão lambda. O resultado é impresso no console.
Filtro de fluxo Java
O filtro funciona corretamente, mas nem sempre queremos filtrar usando uma expressão de lambda de maneira direta, pois ela não tem uma grande capacidade de reutilização. Em muitos casos, geralmente é melhor ter algum tipo de apoio que define uma série de expressões lambda e predicado que nos ajudam e são reutilizadas.
Vamos ver um par de exemplos.
package com.arquitecturajava;import java.util.function.Predicate;public class LibroUtils {public static Predicate<Libro> filtroCategoria(String categoria) {return (Libro l) -> {return l.getCategoria().equals(categoria);};}}
Desta forma, podemos poder reutilizar a expressão e filtrar pela categoria que queremos:
No entanto, o mais comum em muitos casos é gerar expressões funcionais complexas e, em seguida, flertar-os através de métodos de referência. Por exemplo, algo como a seguinte expressão.
package com.arquitecturajava;import java.util.function.Predicate;public class LibroUtils { public static Predicate < Libro > filtroCategoria(String categoria) { return (Libro l) - > { return l.getCategoria().equals(categoria); }; } public static boolean buenosLibros(Libro libro) { Predicate < Libro > p1 = (Libro l) - > l.getCategoria().equals("ciencia ficcion"); Predicate < Libro > p2 = (Libro l) - > l.getCategoria().equals("fantasia"); Predicate < Libro > p3 = (Libro l) - > l.getPaginas() > 1000; Predicate < Libro > ptotal = p1.or(p2).and(p3); return ptotal.test(libro); }}
Desta forma, podemos invocar este tipo de filtro e reutilizá-lo.
lista .stream() .filter(LibroUtils::buenosLibros) .map(Libro::getTitulo) .forEach(System.out::println);
O resultado é: