Java 8 stream filter on multiple filters

Viewed 445

I have a list of filters and I want to apply them on a stream of Order:

@Autowired
private List<Filter> filters;

Where Filter is an interface:

public interface Filter {

boolean filter(Order order);}

I found that I can do something like

 orders
.stream()
.filter(order -> filter1.filter(order))
.filter(order -> filter2.filter(order))...

But such approach is not correct as my list is dynamic. Can someone help me

1 Answers

You first need to create a Predicate out of all your filters. For this, you can reduce them to a final Predicate by means of the AND operator:

Predicate<Order> predicate = filters.stream()
    .map(f -> (Predicate<Order>) f::filter)
    .reduce(Predicate::and)
    .orElse(o -> true);

Now, you can apply this predicate to the stream of orders:

orders.stream()
    .filter(predicate)
    ...
Related