Предположим, у меня есть массив или список статуса и вы хотите отфильтровать список элементов, статус которых соответствует любому из данных. Поэтому я продолжаю создавать предикат. Я начал его инициализации при сравнении с первым, то добавление условий с or
, что привело к минимальному предиката, но было много кода:Объединить предикаты Java 8 с дизъюнкцией
Predicate<Rec> predicate = null;
for (SendStatus status : statuss) {
Predicate<Rec> innerPred = nr -> nr.getStatus() == status;
if (predicate == null)
predicate = innerPred;
else
predicate = predicate.or(innerpred);
}
Более элегантно, я придумал следующий код:
Predicate<Rec> predicate = nr -> false;
for (SendStatus status : statuss) {
predicate = predicate.or(nr -> nr.getStatus() == status);
}
Это выглядит лучше, но имеет бесполезный предикат в начале цепи. У Apache Collections был AnyPredicate
, который мог состоять из любого числа предикатов, и я в основном ищу замену.
Является ли этот избыточный предикат приемлемым? Есть ли еще более элегантный способ написать это?
Почему бы не использовать 'Predicate predicate = nr -> statuss.contains (nr .getStatus());'? –
Jerry06
Эй, @ Jerry06, вы совершенно правы в этом случае (и я изменил свой код, чтобы использовать именно это). Однако я задаю вопрос об общем случае. –