How can be achieved to pass a “list of filters” to a stream in Java 8, instead of applying them individually as illustrated in the following example?
https://howtodoinjava.com/java8/stream-multiple-filters-example/
The purpose would be to dynamically create a list of filters, one way would be to iterate through a list of filters and apply it to the list to be filtered.
Any other idea?
UPDATE:
Thanks for the comment of the predicate:
final Predicate<?> predicate = new Predicate<?>() { @Override public boolean test(Object object) { return false; //TODO: Implement first predicate } } ; predicate.and(...); //Implement another predicate.
Regards
~M
Advertisement
Answer
You can chain predicates with either the and
or or
operator. Do you want your combined predicate to be a predicate that matches objects that match all the component predicates, or just at least one of them? If you want to simulate a chain of filter
calls:
someStream.filter(...) .filter(...) .filter(...) .filter(...)
Then you should use and
.
Depending on what you choose, you can use either of these methods:
public static <T> Predicate<T> combineFilters(List<Predicate<T>> filters) { return filters.stream().reduce(Predicate::and).orElse(x -> true); } public static <T> Predicate<T> combineFilters(List<Predicate<T>> filters) { return filters.stream().reduce(Predicate::or).orElse(x -> false); }
Usage:
someStream.filter(combineFilters(aListOfFilters)) ...