If you have a Collection<Predicate<T>> filters
you can always create a single predicate out of it using the process called reduction:
Predicate<T> pred=filters.stream().reduce(Predicate::and).orElse(x->true);
or
Predicate<T> pred=filters.stream().reduce(Predicate::or).orElse(x->false);
depending on how you want to combine the filters.
If the fallback for an empty predicate collection specified in the orElse
call fulfills the identity role (which x->true
does for and
ing the predicates and x->false
does for or
ing) you could also use reduce(x->true, Predicate::and)
or reduce(x->false, Predicate::or)
to get the filter but that’s slightly less efficient for very small collections as it would always combine the identity predicate with the collection’s predicate even if it contains only one predicate. In contrast, the variant reduce(accumulator).orElse(fallback)
shown above will return the single predicate if the collection has size 1
.
Note how this pattern applies to similar problems as well: Having a Collection<Consumer<T>>
you can create a single Consumer<T>
using
Consumer<T> c=consumers.stream().reduce(Consumer::andThen).orElse(x->{});
Etc.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…