查找满足断言的第一个元素

问题:查找满足断言的第一个元素

我刚刚开始使用Java 8的lambdas,我尝试去实现一些我在函数式语言里面经常用的

例如,大部分的函数式语言里有一些查找函数,针对序列或者list进行操作,返回使得断言为真的第一个元素。我唯一知道可以在Java8里面实现的就是:

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

但是这对于我来说似乎效率不高,这个filter会扫描整个list,至少在我的理解上是这样的,这有可能是错误的,是不是有更好的方法。

回答一

return dataSource.getParkingLots()
                 .stream()
                 .filter(parkingLot -> Objects.equals(parkingLot.getId(), id))
                 .findFirst()
                 .orElse(null);

我能filter出在对象列表里面唯一的那个对象,所以我经常用这个,希望可以帮到你吧

回答二

不是的,filter不用扫描整个stream的。它是一个中间操作,会返回一个lazy stream(事实上,所有的中间操作都会返回一个lazy stream)。为了说服你,你可以做一下下面的测试

List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
int a = list.stream()
            .peek(num -> System.out.println("will filter " + num))
            .filter(x -> x > 5)
            .findFirst()
            .get();
System.out.println(a);

输出:

will filter 1
will filter 10
10

你可以看到它只处理了流的前两个元素。所以你可以采取这个非常好的方法的

回答三

@AjaxLeung已经回答了, 但是已经很难在评论中找到了.
只是用来检查

lst.stream()
    .filter(x -> x > 5)
    .findFirst()
    .isPresent()

可以被简化为

lst.stream()
    .anyMatch(x -> x > 5)

文章翻译自Stack Overflow:https://stackoverflow.com/questions/23696317/find-first-element-by-predicate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值