Le opzioni del filtro del flusso Java sono molto ampie ma per lavorare con loro comodamente, è necessario comprendere il funzionamento dell’interfaccia di predicazione in dettaglio. Costruiremo un esempio con un elenco di libri che ci consente di capire meglio come funzionano i filtri. Per questo andiamo dai seguenti oggetti.
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); }}
Abbiamo quattro libri e abbiamo appena usato un semplice filtro che seleziona i libri che passano da 1000 pagine che utilizzano un predicato con un’espressione lambda. Il risultato è stampato sulla console.
Java Stream Filter
Il filtro funziona correttamente, ma non sempre vogliamo filtrare utilizzando un’espressione lambda in modo diretto poiché non ha una grande capacità di riutilizzo. In molti casi è di solito è meglio avere una specie di supporto che definisce una serie di lambda e le espressioni predicate che ci aiutano e vengono riutilizzate.
Vediamo un paio di esempi.
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);};}}
P> In questo modo possiamo riutilizzare l’espressione e filtrare dalla categoria che vogliamo:
lista.stream().filter(LibroUtils.filtroCategoria("ciencia ficcion")).map(libro - > libro.getTitulo()).forEach(System.out::println);
Tuttavia il più consueto in molti casi è Generare espressioni funzionali complesse e poi li flirta attraverso i metodi di riferimento. Ad esempio, qualcosa come la seguente espressione.
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); }}
In questo modo possiamo richiamare questo tipo di filtro e riutilizzarlo.
lista .stream() .filter(LibroUtils::buenosLibros) .map(Libro::getTitulo) .forEach(System.out::println);
Il risultato è:
Utilizziamo solo il filtro del flusso Java e le sue opzioni.
Altri articoli correlati:
- Java Pronto interfaccia e dei tuoi metodi
- Giava Stream Foreach and Collections
- Java 8 Lambda Expressions (i)
- Oracle Java Lambda