归约、分组与分区,深入讲解JavaStream终结操作

  1. 聚合方法代表着整个流计算的最终结果,所以它的返回值都不是Stream。

  2. 聚合方法返回值可能为空,比如filter没有匹配到的情况,JDK8中用Optional来规避NPE。

  3. 聚合方法都会调用evaluate方法,这是一个内部方法,看源码的过程中可以用它来判定一个方法是不是聚合方法。

ok,知晓了聚合方法的特性,我为了便于理解,又将聚合方法分为几大类:

其中简单聚合方法我会简单讲解,其它则会着重讲解,尤其是收集器,它能做的实在太多了。。。

Stream的聚合方法是我们在使用Stream中的必用操作,认真学习本篇,不说马上就能对Stream得心应手,起码也可以行云流水吧😄

1. 简单聚合方法


第一节嘛,先来点简单的。

Stream的聚合方法比上一篇讲过的无状态和有状态方法都要多,但是其中也有一些是喵一眼就能学会的,第一节我们先来说说这部分方法:

  • count():返回Stream中元素的size大小。

  • forEach():通过内部循环Stream中的所有元素,对每一个元素进行消费,此方法没有返回值。

  • forEachOrder():和上面方法的效果一样,但是这个可以保持消费顺序,哪怕是在多线程环境下。

  • anyMatch(Predicate predicate):这是一个短路操作,通过传入断言参数判断是否有元素能够匹配上断言。

  • allMatch(Predicate predicate):这是一个短路操作,通过传入断言参数返回是否所有元素都能匹配上断言。

  • noneMatch(Predicate predicate):这是一个短路操作,通过传入断言参数判断是否所有元素都无法匹配上断言,如果是则返回true,反之则false。

  • findFirst():这是一个短路操作,返回Stream中的第一个元素,Stream可能为空所以返回值用Optional处理。

  • findAny():这是一个短路操作,返回Stream中的任意一个元素,串型流中一般是第一个元素,Stream可能为空所以返回值用Optional处理。

虽然以上都比较简单,但是这里面有五个涉及到短路操作的方法我还是想提两嘴:

首先是findFirst()findAny()这两个方法, 由于它们只需要拿到一个元素就能方法就能结束,所以短路效果很好理解。

接着是anyMatch方法,它只需要匹配到一个元素方法也能结束,所以它的短路效果也很好理解。

最后是allMatch方法和noneMatch,乍一看这两个方法都是需要遍历整个流中的所有元素的,其实不然,比如allMatch只要有一个元素不匹配断言它就可以返回false了,noneMatch只要有一个元素匹配上断言它也可以返回false了,所以它们都是具有短路效果的方法。

2. 归约


2.1 reduce:反复求值

第二节我们来说说归约,由于这个词过于抽象,我不得不找了一句通俗易懂的解释来翻译这句话,下面是归约的定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值