上一章我们讲了java8新特性之lambda表达式,作为一个匿名函数,极大的简化了代码。今天我们来聊聊java8的另一个可以简化代码的特性——stream。
lambda表达式是stream的基础,建议先学习lambda表达式在学习stream相关知识。
1、首先,stream是什么?
刚接触可能觉得stream和对文件进行操作的io流类似,但实际上这两者一点关系都没有。
stream是一个数据渠道,用于操作数据源(集合、数组等)所生产的元素序列(用人话说就是它是来操作集合数组里的元素的)
2、stream怎么用?
一般来说stream操作分3大步骤:
- 创建stream:从一个数据源(如:集合、数组)获取一个流
- 中间操作链:对数据源的数据进行处理
- 终止操作:执行中间操作链,并产生结果
创建流的方式:
一、collection提供了2个方法stream()和parallelstream()
二、Array提供了stream()
三、Stream的静态方法of()
四、创建无限流
无限流的创建应为使用了迭代器,查看iterate的实现可以看到
也就是说,迭代器会一直执行,这样一直创建无限个对象的流,我们称为无限流。
除了iterate还有generate也可以创建无限流:
中间操作链:
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,这种方式称为“惰性求值”。
筛选:
filter:接收lambda,从流中排除某些元素
limit:截断流,截取指定数量的元素
skip:跳过指定数量的元素,与limit互补
distinct:筛选,通过流中元素的hashcode和equals方法去除重复元素
映射:
map:接收lambda,将流中元素按给定的方法映射成一个新的元素,最后返回一个新的流
flatMap:接收一个函数作为参数,将流中的每个值换成另一个流,然后把所有流连接成一个流
排序:
sorted:自然排序
sorted(Comparator<? super T> comparator):自定排序
终止操作:
终止操作会从流的流水线上生成结果,其结果可以是任何不适流的值,例如:list,String
查找与匹配:
allMatch:检查是否匹配所有元素
anyMatch:检查是否至少匹配一个元素
noneMatch:检查是否没有匹配所有元素
findFirst:返回第一个元素
findAny:返回流中任意元素
count:返回流中元素的和
max:返回流中最大值
min:返回流中最小值
forEach:迭代所有元素
规约:
reduce(T identity, BinaryOperator) / reduce(BinaryOperator) :将流中元素反复结合起来,得到一个值
收集:
collect(Collector c):将流转换为其他形式
以上就是流完整的使用过程。