1.Stream流介绍
当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。我们来体验集合操作数据的弊端,需求如下:
一个ArrayList集合中存储有以下数据:张无忌、周芷若、赵敏、张三丰
需求:1.拿到所有姓张的 2.拿到名字长度为3个字的 3.打印这些数据
import java.util.ArrayList;
import java.util.Collections;
public class Demo {
public static void main(String[] args) {
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> threeList = new ArrayList<>();
for (String name : zhangList) {
if (name.length() == 3) {
threeList.add(name);
}
}
// 3.打印这些数据
for (String name : threeList) {
System.out.println(name);
}
}
}
通过上述示例代码,可用看到集合操作数据的弊端:为每个需求都要循环一次,还要搞一个新集合来装数据,非常麻烦。因此在JDK1.8的时候特出了一个新特性:Stream流。Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工序,在流水线上,通过多个工序让一个原材料加工成一个商品。如果使用JDK1.8的Stream流处理上述需求,其示例代码为:
import java.util.ArrayList;
import java.util.Collections;
public class Demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张三丰");
list.stream().filter((s)->{
return s.startsWith("张");
}).filter((s)->{
return s.length() == 3;
}).forEach((s)->{
System.out.println(s);
});
}
}
执行上述代码,其输出结果为:
张无忌
张三丰
2.获取Stream流的两种方式
第一种:根据Colllection获取流
java.util.Collection接口中加入了default方法stream用来获取流,所有其实现类均可获取流。
public interface Collection{
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
}
import java.util.*;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
// 方式一:根据Collection获取流
// Collection接口中有一个默认的方法:default Stream<E> stream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 =set.stream();
Map<String,String> map = new HashMap<>();
Stream<String> stream3=map.keySet().stream();
Stream<String> stream4=map.values().stream();
Stream<Map.Entry<String,String>> stream5 = map.entrySet().stream();
}
}
第二种:Stream中的静态方法of获取流
由于数组对象不可能添加默认方法,所以Stream接口提供了静态方法of,使用很简单:
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
// 方式二:Stream中的静态方法of获取流
// static<T> Stream<T> of(T... values)
Stream<String> stream6=Stream.of("aa","bb","cc");
String[] strs ={"aa","bb","cc"};
Stream<String> stream7 = Stream.of(strs);
// 基本类型的数组,是不行的,Stream会将整个数组看做一个元素进行操作
int[] arr ={11,22,33};
Stream<int[]> stream8=Stream.of(arr);
}
}
备注:of方法的参数其实是一个可变参数,所以支持数组