主题:流的认知
一、 流是什么:
- 流是将【逻辑序列】中的每一个元素,以【流水线】方式,使用【自定义的行为】进行【逐一】加工的【声明式】的API。
- 逻辑序列: 在物理上并不一定是顺序结构,可以是List,Set,Map,文件等。
- 流水线: 每一步操作,可以再返回流;同时function,operator的操作可以进行合并。
- 自定义行为:可以使用Lamda, 方法引用,内部类的方式完成“参数化行为”。
- 逐一: 并不代表需要以物理上的顺序完成遍历(外部遍历),它会基于自己的算法进行内部遍历(如多线程方式)
- 声明式: 只需要说明你要的结果,并不需要说明运算的过程。(每个元素的加工行为,需要传入)。
二、API类型
- 中间操作:以流为返回结果的操作,如map,filter
- 终端操作:不以流为返回结果的操作,如forEach,collect
三、流的三大法宝
- 延迟创建:其中间操作在没有终端操作之前,不立即执行,这就为算法的合并优化提供了可能性。
- 内部迭代:迭代过程对于操作者完全透明,这为并行操作提供了可能性。
- 行为参数化:每个元素的操作行为由用户提供,保证了使用的灵活性。
四、流的使用
- 一个数据源
- 一次转换
- 若干次中间操作
- 一次终端操作
demo:
Arrays.asList("abc","dd","cde","a","ab")//数据源
.stream()//转换成为Stream
.map(s->s.replaceAll("a","x"))
.filter(s->s.length()>=2)//若干次中间操作
.forEach(s-> System.out.println(s));//一次终端操作