使用传统的方式,遍历集合,对集合中的数据进行过滤与使用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 }