加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8流优先级过滤

发布时间:2020-12-15 08:27:42 所属栏目:Java 来源:网络整理
导读:我的代码看起来像: for (SomeObject object : objects) { if (object.getSomething() == Something.SomethingHighPriority) { return object; }}for (SomeObject object : objects) { if (object.getSomething() == Something.SomethingLowPriority) { retu
我的代码看起来像:

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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读