2016-10-12 3 views
0

Предположим, у меня есть массив или список статуса и вы хотите отфильтровать список элементов, статус которых соответствует любому из данных. Поэтому я продолжаю создавать предикат. Я начал его инициализации при сравнении с первым, то добавление условий с 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, который мог состоять из любого числа предикатов, и я в основном ищу замену.

Является ли этот избыточный предикат приемлемым? Есть ли еще более элегантный способ написать это?

+6

Почему бы не использовать 'Predicate predicate = nr -> statuss.contains (nr .getStatus());'? – Jerry06

+0

Эй, @ Jerry06, вы совершенно правы в этом случае (и я изменил свой код, чтобы использовать именно это). Однако я задаю вопрос об общем случае. –

ответ

2

Как об этом, предполагая, что statuss является Collection<SendStatus>:

Predicate<Rec> predicate = nr -> statuss.stream().anyMatch(status -> nr.getStatus() == status); 

Или это, если statuss является SendStatus[]:

Predicate<Rec> predicate = nr -> Arrays.stream(statuss).anyMatch(status -> nr.getStatus() == status); 

Или, как suggested by @Jerry06 in a comment, что быстрее, если statuss является Set<SendStatus> , и более простым, чем решение для сбора потоковых данных выше:

Predicate<Rec> predicate = nr -> statuss.contains(nr.getStatus()); 
+0

Поскольку мой вопрос: «Объединить предикаты Java 8 с дизъюнкцией», это может решить неправильную проблему. Чувствуется немного странным создание потока каждый раз при вызове предиката. –

+0

Вы также спрашиваете: «Есть ли еще более элегантный способ написать это?». Этот ответ дал вам три варианта выбора. И последний пример (ИМХО) столь же изящный, как и он. – jannis

Смежные вопросы