簡體   English   中英

將Java 8謂詞與析取相結合

[英]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);

或者這一點,如果statussSendStatus[]

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

或者按照@ Jerry06在注釋中的建議進行操作,如果statussSet<SendStatus> ,則它會更快,並且比上面的流收集解決方案更簡單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM