Stream API 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。总得来说,Stream API 就是提供了一种高效且易于使用的处理数据的方式。
注:需要会使用 Lambda 表达式 地址
Stream 不是集合元素,它不是数据结构并不保存数据,而属于流。
流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
区别:集合注重的是数据的保存,而流注重的是数据的计算
Stream 流的特点:
流的使用步骤:
通过数据源创建 Stream 流
1.Collection
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Stream<String> stream2 = list.parallelStream();
注:parallelStream获取的是并行执行的流,底层使用的是 ForkJoin框架
2.数组
Stream<T> stream3 = Arrays.stream(T array);//int,long,double
3.值
Stream<String> stream4 = Stream.of("a","b","c");
4.函数(无限流)
Stream<Integer> stream5 = Stream.iterate(0, (x) -> x + 2);
Stream<String> stream6 = Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);
流的中间操作
两类操作:
常见的操作:
1.filter(过滤)、forEach(遍历)
int[] nums = {2,1,4,5,8};
IntStream stream = Arrays.stream(nums);
stream.filter((x) -> x%2==0).forEach(System.out::println);
输出结果如下:
2.limit(返回前n个)、skip(丢弃前n个)、sorted(排序)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Stream<Integer> stream = list.stream();
list = stream.limit(5).skip(2).sorted((a,b) -> b.compareTo(a)).collect(Collectors.toList());
System.out.println(list);
输出结果如下:
3.allMatch(所有)、anyMatch(存在)、noneMatch(没有)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
boolean flag = list.stream().allMatch(x -> x > 2);
System.out.println("allMatch:"+flag);
flag = list.stream().anyMatch(x -> x > 2);
System.out.println("anyMatch:"+flag);
flag = list.stream().noneMatch(x -> x > 2);
System.out.println("noneMatch:"+flag);
输出结果如下:
4.min、max、distinct(不重复)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(2);
int a = list.stream().max(Integer::compare).get();
System.out.println("max:"+a);
a = list.stream().min(Integer::compare).get();
System.out.println("min:"+a);
list = list.stream().distinct().collect(Collectors.toList());
System.out.println(list);
输出结果如下:
5.map、flatMap(把 input Stream 的每一个元素,映射成 output Stream 的另外一个元素,flatMap对应一对多情况)
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list = list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(list);
注:
1.Collector是专门用来作为Stream的collect方法的参数的,而 Collectors 是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,如:
2.无限流一般需要有限制的操作,如:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit 等