• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

167
Vistas
¿Cómo aplicar una colección de filtros a una secuencia de Java?

¿Cómo puedo aplicar una colección de predicados a una secuencia de Java?

El siguiente código ilustrará lo que tengo en mente:

 final Collection<Predicate<MyObject>> filters = getFilters(); final Stream<MyObject> oStream = getMyObjectStream(); oStream .filterAll(filters) // <- this one doesn't exist .forEach(System.out::println);

Actualmente estoy usando una función .filter(m -> applyAllFilters(m, filters)) con un bucle clásico, pero me pregunto si hay una forma más "fluida".

 boolean applyAllFilters(final MyObject m, final Collection<Predicate<MyObject>> filters) { Iterator Predicate<MyObject> iter = filters.iterator(); while(iter.hasNext()) { Predicate<MyObject> p = iter.next(); if (!p.test(m)) { return false; } } return true; }
over 3 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Simplemente puede reducir todos los predicados en un solo predicado que se combina con todos ellos de esta manera:

 oStream .filter(filters.stream().reduce(Predicate::and).orElseThrow()) .forEach(System.out::println);

Alternativamente, si espera que la lista de filtros esté vacía en algunos casos, puede hacerlo de esta manera:

 oStream .filter(filters.stream().reduce(o -> true, Predicate::and)) .forEach(System.out::println);
over 3 years ago · Santiago Trujillo Denunciar

0

Puede crear previamente un filtro que cumpla con todos los criterios.

Suponga que tiene tres Predicate <MyObject> a, b, c . Estos se pueden combinar de la siguiente manera, independientemente de oStream .

 Predicate<MyObject> allFilter = e -> a.test(e) && b.test(e) && c.test(e);

Entonces puedes hacer esto.

 Predicate<MyObject> filterAll = filters.stream() .reduce(Predicate::and).orElse(e -> true); oStream .filter(filterAll) .forEach(System.out::println);
over 3 years ago · Santiago Trujillo Denunciar

0

Puede usar un bucle para aplicar los filtros:

 final Collection<Predicate<MyObject>> filters = getFilters(); Stream<MyObject> oStream = getMyObjectStream(); for(Predicate<MyObject> p : filters) { oStream = oStream.filter(p); } oStream.forEach(System.out::println);
over 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda