Filtro de fluxo de Java e predicados

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.

Diagrama de filtro de fluxo Java

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 é:

resultado do filtro do fluxo de Java ID

Nós apenas usamos o filtro do fluxo de Java e suas opções.

Outros artigos relacionados:

    interface predicado Java e seus métodos
  1. java fluxo foreach e coleções
  2. java 8 expressões lambda (i)
  3. oracle java lambda

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *