Потоковый фильтр Java 8 на нескольких фильтрах - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть список фильтров, и я хочу применить их к потоку Order:

@Autowired
private List<Filter> filters;

Где Filter - это интерфейс:

public interface Filter {

boolean filter(Order order);}

Я обнаружил, что могусделать что-то вроде

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

Но такой подход не верен, так как мой список динамичен.Может ли кто-нибудь помочь мне

1 Ответ

0 голосов
/ 20 сентября 2018

Сначала вам нужно создать Predicate из всех ваших фильтров.Для этого вы можете уменьшить их до конечного Predicate с помощью оператора AND:

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

Теперь вы можете применить этот предикат к потоку заказов:

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