将Java 8谓词与析取相结合

时间:2016-10-12 07:29:23

标签: java lambda predicate

假设我有一个数组或状态列表,并希望过滤状态与给定状态匹配的元素的列表。所以我继续创建一个谓词。我首先通过与第一个进行比较来初始化它,然后使用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 Collections有AnyPredicate可以由任意数量的谓词组成,我基本上都在寻找替代品。

这个多余的谓词是否可以接受?有没有更优雅的方式来写这个?

1 个答案:

答案 0 :(得分:2)

假设statussCollection<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);

或者按suggested by @Jerry06 in a comment执行,如果statussSet<SendStatus>,则更快,并且比上面的流式采集解决方案更简单:

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