感觉这节的内容主要是在讲“在stream中避免使用forEach来执行计算,应该使用无副作用的函数对象”。
stream是把处理数据的函数构造成一系列的变形,每一级结果都尽可能靠近上一级结果的纯函数。在使用stream 时应该尽量避免修改到已有对象,及使用无副作用的函数。而forEach 比较容易会修改到已有对象,因此在使用时要注意,只用forEach 来报告stream 的计算结果,而不是执行计算。
作者主要介绍了Collectors的纯函数方法,如toList、toSet、toMap、groupingBy、 joining等。
在日常开发中,常用的Collectors 主要就是上面这些,有时forEach 写的比较简单,编译器还会主动提示可以使用Collectors中的方法替代。但是有时还是会在开发中没有这样的意识,比如下面这段代码:
使用了forEach 方法向一个map中添加对象。这其实就是在forEach 中修改了外部的对象,产生了副作用。如果不想stream产生这样的副作用,使用stream 先运算得到一个map,再在stream 外putAll即可。
系统中类似的代码其实还是有不少的。当我们发现使用forEach 会修改到已有对象的状态时,就应该去思考下是否有其他无副作用的方法能够替代它。