java - 将 Java 8 谓词与析取相结合

标签 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,我基本上正在寻找替代品。

这个多余的谓词可以接受吗?有没有更优雅的写法?

最佳答案

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

或者像 suggested by @Jerry06 in a comment 那样做,如果 statuss 则更快是 Set<SendStatus> ,并且比上面的流式收集解决方案更简单:

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

关于java - 将 Java 8 谓词与析取相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39992857/

相关文章:

c++ - 作为成员变量的 lambda 函数崩溃

c# - PredicateBuilder 返回零记录

java - 在 java 中返回 try-catch finally block 。这个例子有什么好处吗?

java - 如果未找到 @Named,则使用 dagger 默认实现

c++ - 函数参数包含完整的函数

c# - Linq 中没有 return 关键字的 Func<int,bool>?

rust - 使用 trim_end_matches 作为闭包函数 : expected signature . 类型不匹配 .. 找到 "for<' r> 的签名 ..."

c# - 创建自定义谓词

java - YouTube API Java 演示 : youtube-api-samples do not compile

java - 将库添加到 jar 中