今日内容
- Stream流
- 方法引用
jdk1.8 函数式编程思想
- 强调的是做什么,而不是怎么做.
Stream流
- 简化了集合和数组的操作.
- Stream不是IO体系当中的流对象.
流式思想概述
- 对一组数据进行多过滤,筛选,统计..
- Stream流并不会存储元素
- Stream流是一个来自数据源的元素队列并支持聚合操作
数据源:可以是集合或数组等等.
基本特征
- Pipelining:中间操作都会流对象本身.
- 内部迭代: Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
外部迭代:以前对集合遍历都是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代, 这叫做外部迭代。
特点
1.流对象只能被消费一次
2.只能内部迭代遍历
使用步骤
1.获取流
2.拼接模型(整体操作)
3.获取结果
获取Stream流
集合获取
- list.Stream();
- set.Stream();
Map集合
- map.keySet().Stream();
- map.valuse().Stream();
数组
- Strea.of(数组);
Stream只能接受引用类型,int[]数组相当于一个参数!!!
Stream流中的常用方法
终结方法
- 返回值类型不再是Stream自身的方法.foreach() 和 chount()
延迟方法
- 返回值类型仍然是Strea 对象,支持链式调用.
foreach() 遍历
- 终结性方法
- 底层依赖于Consumer接口,用来消费数据,用来做数据的遍历.
增强for依赖的是迭代器,foreach是一个方法
- 该方法不保证元素的逐一消费动作是有序执行的
- 串行是有序的(逐个处理,单管) Stream(String) one = list.Stream();
- 并行是无序的(将任务分解,多管) Stream(String) two = list.paralleStream();
filter() 过滤
- 延迟方法
- 参数:Predicate接口 -> test()
map() 映射,转换类型
- 延迟方法
- 参数:Function接口 -> apply()
count() 统计
- 终结方法
- 返回值类型:long
limit() 截取
- 延迟方法
- 参数是一个long类型(n),返回的流只保留前n个.
如果参数大于集合长度,返回所有元素.传入负数会报异常.
skin() 跳过
- 延迟方法
- 参数是一个long类型(n),返回的流只保留n到最后一个.(与limit相反)
concat() 拼接
- 静态方法
- 将两个流整合成一个流.返回一个拼接后的流.
方法引用
概念
- 引用对象中的方法,来完成具体的操作,从而对(Lambda表达式的书写)再次进行简化.
格式
- 对象::方法名