我的代码如下所示:
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/