JDK1.8升级这么久!Stream流的规约操作有哪些?
前段时间介绍了部分 ,理解起来并不困难,但
规约操作又被称作折叠操作,是通过某个连接动作将所有元素汇总成一个汇总结果的过程。元素求和、求最大值或最小值、求出元素总个数、将所有元素转换成一个列表或集合,都属于规约操作。
最大或最小值这类规约操作很好理解(至少方法语义上是这样),我们着重介绍和,这是比较有魔法的地方。
多面手reduce()
reduce操作可以实现从一组元素中生成一个值,、、、等都是reduce操作,将他们单独设为函数只是因为常用。的方法定义有三种重写形式:

虽然函数定义越来越长,但语义不曾改变,多的参数只是为了指明初始值,或者是指定并行执行时多个部分结果的合并方式。最常用的场景就是从一堆值中生成一个值。用这么复杂的函数去求一个最大或最小值,你是不是觉得设计者有病。其实不然,因为“大”和“小”或者“求和"有时会有不同的语义。
需求:

上述代码会选出最长的单词

上述代码标号(2)处将i. 字符串映射成长度,ii. 并和当前累加和相加。这显然是两步操作,使用函数将这两步合二为一,更有助于提升性能。如果想要使用和组合来达到上述目的,也是可以的。
擅长的是生成一个值,如果想要从
终极武器collect()
不夸张的讲,如果你发现某个功能在

上述代码分别列举了如何将
是干什么的?
是什么意思?
Collectors 是个什么东西?
接口的静态方法和默认方法
Java 8允许在接口中加入具体方法。接口中的具体方法有两种,
default 方法和static 方法,就是Function 接口的一个静态方法。返回一个输出跟输入一样的Lambda表达式对象,等价于形如形式的Lambda表达式。
上面的解释是不是让你疑问更多?不要问我为什么接口中可以有具体方法,也不要告诉我你觉得比方法更直观。我会告诉你接口中的
方法引用
诸如的语法形式叫做方法引用(

收集器
相信前面繁琐的内容已彻底打消了你学习Java函数式编程的热情,不过很遗憾,下面的内容更繁琐。但这不能怪Stream类库,因为要实现的功能本身很复杂。

收集器(
目标容器是什么?是
ArrayList 还是HashSet ,或者是个TreeMap 。新元素如何添加到容器中?是还是。
如果并行的进行规约,还需要告诉
结合以上分析,

通常情况下我们不需要手动指定
使用collect()生成Collection
前面已经提到通过方法将

上述代码能够满足大部分需求,但由于返回结果是接口类型,我们并不知道类库实际选择的容器类型是什么,有时候我们可能会想要人为指定容器的实际类型,这个需求可通过方法完成。

上述代码(3)处指定规约结果是
使用collect()做字符串join
这个肯定是大家喜闻乐见的功能,字符串拼接时使用生成的收集器,从此告别

collect()还可以做更多
除了可以使用