Stream 流介绍
目标
了解集合的处理数据的弊端
理解Stream流的思想和作用
集合处理数据的弊端
当我们需要对集合中的元素进行操作的时候,除了必须的添加,删除,获取外,最典型的就是遍历集合。我们来体验集合操作的弊端,需求如下:
一个 ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰
需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
代码如下:
public class StreamTest {public static void main(String[] args) {// 一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰// 需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张无忌", "周芷若", "赵敏", "张强", "张三丰");// 1.拿到所有姓张的ArrayList<String> zhanglist = new ArrayList<>();for (String name : list) {if(name.startsWith("张")){zhanglist.add(name);}}// 2.拿到名字长度为3个字的ArrayList<String> lengthlist = new ArrayList<>();for (String name : zhanglist){if(name.length() == 3){lengthlist.add(name);}}//3.打印这些数据for (String name: lengthlist) {System.out.println(name);}}
}
循环遍历的弊端
这段代码中含有三个循环,每一个作用不同。
1.首先筛选所有姓张的人;
2.然后筛选名字又三个字的人;
3.最后进行输出打印。
每当我们需要对集合中的元素进行操作时,总需要进行循环,循环,再循。这是理所当然的吗?不是。循环是做事情的方式,而不是目的。每个需求都要循环一次,还要搞一个新集合来装数据,如果希望再次遍历,只能使用另一个循环从头开始。
那Stream能给我们带来怎么样的写法呢?
Stream更优的写法。
下面来看一下借助Java 8的Stream API,修改后的代码
public class StreamTest01 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3 ).forEach(System.out::println);}
}
直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印。我们真 正要做的事情内容被更好地体现在代码中。
Stream流式思想概述
注意:Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象!
Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工 处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。
Stream API能让我们快速完成许多复杂的操作,如筛选、切片、映射、查找、去除重复,统计,匹配和归约。
小结:首先我们了解了集合操作数据的弊端,每次都要循环遍历,还要创建新的集合,很麻烦。
Stream是流式思想,相当于工厂的流水线,对集合中的数据进行加工处理