1.Stream流注意事项:
惰性求值就是要求我们写终结操作。
第二个:
显然第一个foreach终结操作后,流就结束了,我们的得重新开始,不然就报错。
第三个是在正常操作下符合的,不正常操作下:
这种又丑又危险的代码不要写哦
2.Optional 概述
这能让我们写出优雅而安全的代码
例一:
空指针异常
3.Optional的使用
创建对象
例一:
一个匿名内部类一个lambda
后面有一个消费的术语,这其实就来自于Consumer这个类,它在Optional的操作中挺重要的。
ifPresent里含有判断是否为空,所以可以安全地输出。
如果author不是空的:
那authorOptional里面封装的Value就是返回的author
还有,这里是不是感觉也没有简化和优雅呢?这主要是因为这个getAuthor不太好,下面我们写个直接返回optional对象的:
optiona.empty()
综上,显然ofNullable()最方便
源码:
安全的消费值
消费就是这个:
安全地获取值
首先不推荐的是get()
源码:
安全的方法:
下面这个若为空就抛出异常,在spring框架中常常使用。
过滤
不记得就用匿名内部类然后idea右键后一键生成lambda表达式:
Predicate泛型抽象接口只有唯一的抽象方法,其他都是默认方法default
判断
数据转换
4.函数式接口
定义
常见接口
Consumer Function Predicate,这些都不用记,我们需要重写的地方,我们右键生成匿名内部类它自己会提示的,记住,不要死记硬背,计算机有那么多东西,有些东西是不值得你去花太多时间的。
常用的默认方法
and
实际上这两个判断条件完全可以写在一个函数体里面会更方便,所以and一般不用在这里,而是用在下面这种自定义的函数里:
例:
这个函数的if里面predicate predicate2都要满足,用的时候给这个函数传入两个匿名内部类
或者lambda
or
negate
5.方法引用(了解即可)
语法详解
引用类的静态方法
引用对象的实例方法
引用类的实例方法
——>
构造器引用
全部优化后:
6.高级用法
基本数据优化
在这里第二个map:
age是integer类型的,所以+10时要拆箱成int,然后再包装成integer返回
filter这里的比较也是一样,有开销的。
优化:
不过你看这些括号传入的类要稍微记一下
并行流
例子
单个线程:
并行:
加了个parallel后就会有多个线程,比如有三个线程,1-4在第一个线程进入下面的filter reduce,5-6在第二个线程,7-10在第三个线程被操作,从而提高效率(数据流大的情况下)。
调试:
peek是Stream里面的调试方法,中间操作
结果:
而如果不用并行:
则全部都是在主线程里面。
所以parallel可以把串行流转化为并行流
还有一个方法:
parallelstream直接得到的就是并行流