1.1 目标


了解集合的处理数据的弊端
理解Stream流的思想和作用

1.2 集合处理数据的弊端


当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。我们来体验 集合操作数据的弊端,需求如下:

一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰
需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据

image.png

循环遍历的弊端

这段代码中含有三个循环,每一个作用不同:

1. 首先筛选所有姓张的人;
2. 然后筛选名字有三个字的人;
3. 最后进行对结果进行打印输出。

每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循环 是做事情的方式,而不是目的。每个需求都要循环一次,还要搞一个新集合来装数据,如果希望再次遍历,只能再使 用另一个循环从头开始。

那Stream能给我们带来怎样更加优雅的写法呢?

Stream的更优写法

下面来看一下借助Java 8的Stream API,修改后的代码:

image.png

  1. package com.itheima.demo05stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. /*
  5. 目标:体验集合操作数据的弊端
  6. 小结:
  7. 1.集合操作数据的弊端?
  8. 每个需求都要循环一次,还要搞一个新集合来装数据, 麻烦
  9. */
  10. public class Demo01Intro {
  11. public static void main(String[] args) throws InterruptedException {
  12. // 一个ArrayList集合中存储有以下数据:张无忌,周芷若,赵敏,张强,张三丰
  13. // 需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
  14. ArrayList<String> list = new ArrayList<>();
  15. Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
  16. // 1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
  17. list.stream()
  18. .filter((s) -> {
  19. return s.startsWith("张");
  20. })
  21. .filter((s) -> {
  22. return s.length() == 3;
  23. })
  24. .forEach((s) -> {
  25. System.out.println(s);
  26. });
  27. System.out.println("-----------");
  28. // 1.拿到所有姓张的
  29. ArrayList<String> zhangList = new ArrayList<>(); // {"张无忌", "张强", "张三丰"}
  30. for (String name : list) {
  31. if (name.startsWith("张")) {
  32. zhangList.add(name);
  33. }
  34. }
  35. // 2.拿到名字长度为3个字的
  36. ArrayList<String> threeList = new ArrayList<>(); // {"张无忌", "张三丰"}
  37. for (String name : zhangList) {
  38. if (name.length() == 3) {
  39. threeList.add(name);
  40. }
  41. }
  42. // 3.打印这些数据
  43. for (String name : threeList) {
  44. System.out.println(name);
  45. }
  46. }
  47. }

直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印。我们真 正要做的事情内容被更好地体现在代码中。


1.3 Stream流式思想概述


注意:Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象!

Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工

处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。

image.png

image.png
image.png

Stream API能让我们快速完成许多复杂的操作,如筛选、切片、映射、查找、去除重复,统计,匹配和归约。


1.4 小结


首先我们了解了集合操作数据的弊端,每次都需要循环遍历,还要创建新集合,很麻烦
Stream是流式思想,相当于工厂的流水线,对集合中的数据进行加工处理