Java Stream Filter i Predicates

Les opcions de Java Stream Filter són molt àmplies però per poder treballar amb elles de forma còmoda cal entendre el funcionament de la interfície Predicate a detall. Construirem un exemple amb una llista de llibres que ens permet entendre millor com funcionen els filtres. Per a això anem a partir dels següents objectes.

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); }}

Tenim quatre llibres i acabem d’usar un filtre senzill que ens selecciona els llibres que passen de 1000 pàgines servir un Predicate amb una expressió lambda. El resultat s’imprimeix a la consola.

java stream filter

Java Stream Filter

El filtre funciona de forma correcta, però no sempre volem filtren fent servir una expressió lambda d’una forma directa ja que no té una gran capacitat de reutilització. En molts casos sol ser millor tenir alguna mena de suport que defineixi una sèrie d’expressions lambda i predicats que ens ajudin i es reutilitzin.

java stream filter diagram

Anem a veure un parell d’exemples.

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);};}}

D’aquesta manera podem podem reutilitzar l’expressió, i filtrar per la categoria que desitgem:

lista.stream().filter(LibroUtils.filtroCategoria("ciencia ficcion")).map(libro - > libro.getTitulo()).forEach(System.out::println);

No obstant això el més habitual en molts casos és generar expressions funcionals complexes i després lligar-a través de mètodes de referència. Per exemple alguna cosa com la següent expressió.

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); }}

D’aquesta manera nosaltres podem invocar aquest tipus de filtre i reutilitzar.

lista .stream() .filter(LibroUtils::buenosLibros) .map(Libro::getTitulo) .forEach(System.out::println);

El resultat és:

java stream filter resultat

Acabem d’usar Java Stream Filter i les seves opcions.

Altres articles relacionats:

  1. Java Predicate Interface i els seus mètodes
  2. Java Stream foreach i col·leccions
  3. Java 8 Lambda Expressions (i)
  4. Oracle Java Lambda

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *