一、Stream流的概述
1.Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
2.Stream流的作用是什么,结合了什么技术:
简化集合、数组操作的API。结合了Lambda表达式。
3.Stream流式思想的核心:
(1)先得到集合或者数组的Stream流(就是一根传送带)
(2)把元素放上去,然后就用这个Stream流简化的API来方便的操作元素。
(3)对操作后的Stream流进行收集
4.Stream流的三类方法:
获取Stream流:创建一条流水线,并把数据放到流水线上准备进行操作
中间方法:流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
终结方法:一个Stream流只能有一个终结方法,是流水线上的最后一个操作
二、Stream流的获取
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
集合获取Stream流的方式:
可以使用Collection接口中的默认方法stream()生成流,
但是Map集合不能直接调用默认方法stream()生成流
![](https://i-blog.csdnimg.cn/blog_migrate/ae3f1c31bc5b67bcf690ca2a99709f52.png)
数组获取Stream流的方式:
![](https://i-blog.csdnimg.cn/blog_migrate/d631964690e46028bf1eb9c083105f68.png)
代码示例:
//Stream流的获取代码示例
public static void main(String[] args) {
/** -----------------Collection集合获取流--------------------------- */
Collection<String> List = new ArrayList<>();
Stream<String> s = list. stream();
/** ------------------Map集合获取流-------------------------------- */
Map<String,Integer> maps = new HashMap<>();
//键流
Stream<String> keyStream = maps.keySet().stream();
//值流
Stream<Integer> valueStream = maps.values().stream();
//键值对流(拿整体)
Stream<Map.Entry<String, Integer>> keyAndValueStream = maps.entrySet().stream();
/** -------------------数组获取流---------------------------------- */
String[] names = {"张三","李四","王五","赵六"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);
三、Stream流的常用API(中间操作方法)
![](https://i-blog.csdnimg.cn/blog_migrate/7c023e67ca0b1aab6b3b940a176d98fa.png)
注意:
中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
在Stream流中无法直接修改集合、数组中的数据。(会得到一个新的Stream流)
四、Stream流的常见终结操作方法
![](https://i-blog.csdnimg.cn/blog_migrate/f8e22bdf2eeb30e0ca7dc122499d98d4.png)
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
中间方法会返回Stream流,所以支持链式调用,而终结方法无返回流
五、收集Stream流
注意:一个Stream流只能使用一次,终结操作后就消失了
1.收集Stream流的含义:(Stream流 —> 数组/集合 )
就是把Stream流操作后的结果数据转回到集合或者数组中去。
2.收集Stream流的作用:
Stream流是方便操作集合/数组的手段
操作的结果数据最终要恢复到集合或者数组中去,集合/数组才是开发中的目的。
3.Stream流的收集方法
![](https://i-blog.csdnimg.cn/blog_migrate/450b8519f87b8724c132df27577bf5ed.png)
4.Collectors工具类提供了具体的收集方式
![](https://i-blog.csdnimg.cn/blog_migrate/2e5865547e646096e4724626b4b75b51.png)
5.代码示例
//将集合转为stream流,并筛选除首字母为“张”的元素
Stream<String> s2 = List.stream().filter(s ->s.startswith("张"));
//注意注意:流只能使用一次
//(1)将stream流转换为List集合
List<String> zhangList = s2. collect( Collectors. toList());
//(2)将stream流转换为Set集合
Set<String> zhangSet = s2. collect( Collectors. toSet());
//(3)将stream流转换为数组
object[] arrs = s2.toArray();