Java 8 流优先过滤

标签 java java-8 java-stream

我的代码如下所示:

for (SomeObject object : objects) {
    if (object.getSomething() == Something.SomethingHighPriority) {
        return object;
    }
}

for (SomeObject object : objects) {
    if (object.getSomething() == Something.SomethingLowPriority) {
        return object;
    }
}

它用于根据某种条件获取集合中的第一个元素。另外,优先级很重要。我需要首先查找一个元素,如果它不存在,则查找第二个元素。

我想使用 Stream API 重写它,但我知道流只使用一次。 现在我以这种方式重写了它,但它看起来比以前更难看了。

Optional<SomeObject> object = 
    objects.stream()
           .filter(object -> object.getSomething() == Something.SomethingHighPriority)
           .findFirst();

if (object.isPresent()) {
    return object.get();
}

object = objects.stream()
                .filter(object -> object.getSomething() == Something.SomethingLowPriority)
                .findFirst();

// No other use cases
return object.orElse(null);

是否可以减少样板文件?

最佳答案

您可以链接这两个管道:

return objects.stream()
              .filter(object -> object.getSomething() == Something.SomethingHighPriority)
              .findFirst()
              .orElseGet(() -> objects.stream()
                                      .filter(object -> object.getSomething() == Something.SomethingLowPriority)
                                      .findFirst()
                                      .orElse(null));

另一种方法是按 object.getSomething()Stream 进行降序排序,然后返回第一个元素(如果它具有两个必需值之一),但这需要 O(NlogN),效率较低。

关于Java 8 流优先过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853084/

相关文章:

java-8 - Java Stream BufferedReader 文件流

Java 8,随时间间隔的复杂分组

java - SharedPreferences 不返回默认值

java - JUnit 测试有问题吗?

java - Hibernate注解关系

java - 获取 LinkedHashMap 中每个条目的最后一个元素?

java - io错误:network adapter could not establish the connection

java - Java 8 中的这个 lambda 特性是如何工作的?

c++ - 将包装函数(如 C/C++.bt(二进制模板)的结构)转换为 Java 8

java - 使用 java8 (Streams) 的自定义对象比较列表