相信兄弟萌在学习时碰到过这样的代码吧:
List<String> list = new ArrayList();
list.stream().forEach(a-> System.out.println(a));
我相信大家初次见到这种代码跟我一样,这 TM 是个啥?能看出来有一个 Lambda 表达式,另外这个 stream 是个啥?
有没有一点像 Steam,游戏下载平台,可以玩吃鸡、CSGO,扯远了,两者毫无关系。
下面我们来揭开 stream 的秘密,Go!
1.集合处理数据的弊端
欸,不是讲 stream 吗?怎么讲到集合的处理数据了。别急,我们从集合处理数据的弊端来引入 stream。
当我们需要对集合中的元素进行操作时,除了必要的添加、删除、获取外,最典型的就是集合遍历。我们来体验集合操作数据的弊端,需求如下:
一个 ArrayList 集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰。
需求:
- 拿到所有姓张的
- 拿到名字长度为 3 个字的
- 打印这些数据
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
//1.拿到所有姓张的
ArrayList<String> zhangList = new ArrayList<String>(); //{"张无忌","张强","张三丰"}
for (String name : list) {
if(name.startsWith("张")){
zhangList.add(name);
}
}
//2.拿到名字长度为3个字的
ArrayList<String> threeList = new ArrayList<String>();//{"张无忌","张三丰"}
for (String name : zhangList) {
if(name.length() == 3){
threeList.add(name);
}
}
//3.打印这些数据 //{"张无忌","张三丰"}
for (String name : threeList) {
System.out.println(name);
}
}
可以看出:每个需求都要遍历一次集合,还要搞一个新集合来装数据,非常麻烦。
2.Stream 流介绍
Stream 流不是一种数据结构,不保存数据,而是对集合中的数据进行加工处理。Stream 流式思想类似于工厂车间的 “生产流水线”。
注意:Stream 流和 IO 流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统 IO 流的固有印象
下面我们来看看借助 Stream 流来改造上面的代码:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");
l