Java 8流优先级过滤

Ole*_*nyk 5 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它用于通过某种条件获取集合中的第一个元素.此外,优先考虑也很重要.我首先需要寻找一个元素,如果它不存在则寻找第二个元素.

我想用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);
Run Code Online (Sandbox Code Playgroud)

是否可以减少样板?

Era*_*ran 6

您可以链接两个管道:

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

另一种方法是Streamobject.getSomething()降序对by 进行排序,然后返回第一个元素(如果它具有两个必需值中的一个),但这样做O(NlogN)效率会降低.