我有一个过滤器列表,我想将它们应用于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))...
但是这种方法是不正确的,因为我的列表是动态的。有人可以帮我吗
答案 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)
...