As opcións de filtro de fluxo Java son moi amplas pero para traballar con eles cómodamente, ten que comprender o funcionamento da interface de predicación en detalle. Imos construír un exemplo cunha lista de libros que nos permite comprender mellor como funcionan os filtros. Para iso imos dos seguintes obxectos.
div =" e10b010734 ">
Temos catro libros e acabamos de usar un filtro sinxelo que nos selecciona os libros que pasan 1000 páxinas usando un predicado cunha expresión lambda. O resultado imprímese na consola.
Filtro de fluxo Java
O filtro funciona correctamente, pero non sempre queremos filtrar usando unha expresión lambda de forma directa xa que non ten unha gran capacidade de reutilización. En moitos casos, normalmente é mellor ter algún tipo de apoio que define unha serie de expresións de Lambda e predicar que nos axudan e son reutilizados.
imos ver un 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);};}}
Deste xeito podemos poder reutilizar a expresión e filtrar a categoría que queremos:
lista.stream().filter(LibroUtils.filtroCategoria("ciencia ficcion")).map(libro - > libro.getTitulo()).forEach(System.out::println);
con todo o máis habitual en moitos casos é para Xerar expresións funcionais complexas e logo flertarlos a través de métodos de referencia. Por exemplo, algo así como a seguinte expresión.
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); }}
Deste xeito podemos invocar este tipo de filtro e reutilizalo.
lista .stream() .filter(LibroUtils::buenosLibros) .map(Libro::getTitulo) .forEach(System.out::println);
O resultado é:
Nós só usamos o filtro de fluxo de Java e as súas opcións.
Outros artigos relacionados:
- Java predicado interface e os seus métodos
- Java fluxo forach and colecciones
- java 8 lambda expresións (I)
- Oracle Java lambda