[英]Combine Java 8 predicates with disjunction
假設我有一個數組或一個狀態列表,並且想過濾一個列表,查找狀態與給定值匹配的元素。 因此,我繼續創建謂詞。 我首先通過與第一個比較來初始化它,然后使用or
添加更多條件,這使謂詞最少,但代碼很多:
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集合有一個AnyPredicate
,可以由任意多個謂詞組成,我基本上是在尋找替代品。
這個多余的謂詞可以接受嗎? 有沒有更優雅的方式來寫這個?
這個怎么樣,假設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);
或者按照@ Jerry06在注釋中的建議進行操作,如果statuss
是Set<SendStatus>
,則它會更快,並且比上面的流收集解決方案更簡單:
Predicate<Rec> predicate = nr -> statuss.contains(nr.getStatus());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.