
惰性求值就是要求我们写终结操作。
第二个:

显然第一个foreach终结操作后,流就结束了,我们的得重新开始,不然就报错。
第三个是在正常操作下符合的,不正常操作下:
这种又丑又危险的代码不要写哦
这能让我们写出优雅而安全的代码




一个匿名内部类一个lambda

后面有一个消费的术语,这其实就来自于Consumer这个类,它在Optional的操作中挺重要的。
ifPresent里含有判断是否为空,所以可以安全地输出。

如果author不是空的:

那authorOptional里面封装的Value就是返回的author
还有,这里是不是感觉也没有简化和优雅呢?这主要是因为这个getAuthor不太好,下面我们写个直接返回optional对象的:

optiona.empty()
![]()
综上,显然ofNullable()最方便


消费就是这个:



源码:



下面这个若为空就抛出异常,在spring框架中常常使用。




不记得就用匿名内部类然后idea右键后一键生成lambda表达式:
Predicate泛型抽象接口只有唯一的抽象方法,其他都是默认方法default



Consumer Function Predicate,这些都不用记,我们需要重写的地方,我们右键生成匿名内部类它自己会提示的,记住,不要死记硬背,计算机有那么多东西,有些东西是不值得你去花太多时间的。





实际上这两个判断条件完全可以写在一个函数体里面会更方便,所以and一般不用在这里,而是用在下面这种自定义的函数里:
例:
这个函数的if里面predicate predicate2都要满足,用的时候给这个函数传入两个匿名内部类

或者lambda













——>



全部优化后:


在这里第二个map:

age是integer类型的,所以+10时要拆箱成int,然后再包装成integer返回
filter这里的比较也是一样,有开销的。
不过你看这些括号传入的类要稍微记一下




单个线程:


并行:
加了个parallel后就会有多个线程,比如有三个线程,1-4在第一个线程进入下面的filter reduce,5-6在第二个线程,7-10在第三个线程被操作,从而提高效率(数据流大的情况下)。
调试:

peek是Stream里面的调试方法,中间操作
结果:

而如果不用并行:
则全部都是在主线程里面。
所以parallel可以把串行流转化为并行流
还有一个方法:

parallelstream直接得到的就是并行流