1、什么是stream流
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。和迭代器不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。
简单来说,Stream是元素的集合,这点让Stream看起来用些类似Iterator。可以支持顺序和并行的对原Stream进行汇聚的操作。可以把Stream当成一个装饰后的Iterator。原始版本的Iterator,用户只能逐个遍历元素并对其执行某些操作;包装后的Stream,用户只要给出需要对其包含的元素执行什么操作,具体这些操作如何应用到每个元素上,就给Stream就好了。原先是人告诉计算机一步一步怎么做,现在是告诉计算机做什么,计算机自己决定怎么做。当然这个“怎么做”还是比较弱的。
2、stream流构造方式
可以从集合或者数组中获取stream流。常用的几种方式:Collection.stream()、Collection.parallelStream()、Arrays.stream(T array) 或者Stream.of()
3、stream的常用方法操作
(1)distince:对stream中包含的元素进行去重
(2)filter:对于stream中包含的函数使用指定的过滤函数进行过滤
(3)map:对于stream中包含的元素使用指定的映射函数进行转换
(4)flatMap:和map有些类似,但是不同的是会把每个元素转换成一个Stream对象,把子Stream中的元素压缩到父集合中
(5)limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素
(6) skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream
4、汇聚函数