• 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

166
Vistas
How to apply a collection of filters to a Java stream?

How can I apply a collection of predicates to a Java stream?

The following code shall illustrate what I have in mind:

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

I'm currently using a function .filter(m -> applyAllFilters(m, filters)) with a classic loop, but wonder if there is a more "streamy" way?

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;
}
about 3 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

You can simply reduce all the predicates into one single Predicate that is anded with all of them like this:

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

Alternatively, if you expect the list of filters to be empty in some cases, you could do it this way:

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

0

You can pre-create a filter that meet all the criteria.

Suppose you have three Predicate <MyObject> a, b, c. These can be combined as follows regardless of oStream.

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

So you can do like this.

Predicate<MyObject> filterAll = filters.stream()
    .reduce(Predicate::and).orElse(e -> true);

oStream
   .filter(filterAll)
   .forEach(System.out::println);
about 3 years ago · Santiago Trujillo Denunciar

0

You can use a loop to apply the filters:

final Collection<Predicate<MyObject>> filters = getFilters();

Stream<MyObject> oStream = getMyObjectStream();
for(Predicate<MyObject> p : filters) {
    oStream = oStream.filter(p);
}
oStream.forEach(System.out::println);
about 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