使用传统的方式,遍历集合,对集合中的数据进行过滤与使用Stream流的方式,遍历集合,对集合中的数据进行过滤

使用传统的方式,遍历集合,对集合中的数据进行过滤

Stream流

说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"0流"呢﹖在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

传统集合的多少遍历代码

  几乎所有的集合(如collection接口或Map 接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。例如∶

  传统方式

package day01.Demo01_Day016;

import java.util.ArrayList;
import java.util.List;

public class Demo01ForEach {
    public static void main(String[] args) {
        List<String> list  = new ArrayList<>();
        list.add("王耀");
        list.add("程冰");
        list.add("若枫");
        list.add("吴小顺");
        list.add("李聪");
        for (String s : list) {
            System.out.println(s);
        }
    }
}

这是一段非常简单的集合遍历操作:对集合中的每一个字符串都进行输出打印操作

遍历循环的弊端

Java8的Lambda让我们更加专注于做什么(What),而不是怎么做(How),这点此前已经结合内部类进行

了对比说明。现在我们仔细体会一下上例代码

for循环的语法就是“怎么做”
for循环的循环体才是“做什么”
为什么使用循环?因为要进行遍历。但循环是遍历的唯一方式吗?遍历是指每一个元素逐一进行处理,而并不是从
第一个到最后一个顺次处理的循环。前者是目的,后者是方式。
试想一下,如果希望对集合中的元素进行筛选过滤:

1. 将集合A根据条件一过滤为子集B;
2. 然后再根据条件二过滤为子集C。

在java8之前的做法可能为:

package day01.Demo01_Day016;
 
import java.util.ArrayList;
import java.util.List;
 
/*
    使用传统的方式,遍历集合,对集合中的数据进行过滤
 */
public class Demo01List {
    public static void main(String[] args) {
        //创建一个List集合,存储姓名
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
 
        //对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中
        List<String> listA = new ArrayList<>();
        for(String s : list){
            if(s.startsWith("张")){
                listA.add(s);
            }
        }
 
        //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
        List<String> listB = new ArrayList<>();
        for (String s : listA) {
            if(s.length()==3){
                listB.add(s);
            }
        }
 
        //遍历listB集合
        for (String s : listB) {
            System.out.println(s);
        }
    }
}

这段代码中含有三个循环,每一个作用不同:
1. 首先筛选所有姓张的人;
2. 然后筛选名字有三个字的人;
3. 最后进行对结果进行打印输出。
每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。这是理所当然的么?不是。循
环是做事情的方式,而不是目的。另一方面,使用线性循环就意味着只能遍历一次。如果希望再次遍历,只能再使
用另一个循环从头开始

Stream的更优写法

下面来看一下借助Java8的StreamAPI,什么叫优雅

使用Stream流的方式,遍历集合,对集合中的数据进行过滤
Stream流是JDK1.8之后出现的
关注的是做什么,而不是怎么做

 1 package day01.Demo01_Day016;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class Demo02Stream {
 7     public static void main(String[] args) {
 8         List<String> list  = new ArrayList<>();
 9         list.add("刘亦菲");
10         list.add("周芷若");
11         list.add("周薇");
12         list.add("胡歌");
13         list.add("夜轻染");
14         list.add("周作人");
15         //对list集合中的元素进行过滤,只要以周开头的元素,存储到一个新的集合中
16         //对list1集合进行过滤,只要姓名长度为3的,存储到一个新的集合中
17         //遍历集合输出
18         list.stream()
19                 .filter(name->name.startsWith("周")).filter(name->name.length()==3).forEach(name-> System.out.println(name));
20 
21     }
22 }

 

posted @ 2022-10-11 15:04  zj勇敢飞,xx永相随  阅读(28)  评论(0编辑  收藏  举报