首页 > 解决方案 > Java 8 stream filter on multiple filters

问题描述

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

标签: filterjava-8java-streamautowired

解决方案


您首先需要Predicate从所有过滤器中创建一个。为此,您可以Predicate通过 AND 运算符将它们简化为最终结果:

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

现在,您可以将此谓词应用于订单流:

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

推荐阅读