Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

198
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 4 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 4 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 4 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 4 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 Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda