多个过滤器上的Java 8流过滤器

时间:2018-09-20 01:47:52

标签: filter java-8 java-stream autowired

我有一个过滤器列表,我想将它们应用于Order流:

@Autowired
private List<Filter> filters;

其中过滤器是接口:

public interface Filter {

boolean filter(Order order);}

我发现我可以做

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

但是这种方法是不正确的,因为我的列表是动态的。有人可以帮我吗

1 个答案:

答案 0 :(得分:4)

首先,您需要在所有过滤器中创建一个Predicate。为此,您可以使用AND运算符将它们简化为最终的Predicate

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

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

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