一、Stream是什么?
Java8中的Stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如,“过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。
二、Stream的构成
当我们使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)→ 数据转换 → 执行操作获取想要的结果。每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道。
三、Stream的创建
在 Java 8 中, 集合接口有两个方法来生成流:
stream() − 为集合创建串行流(由主线程按顺序对流执行操作)
parallelStream() − 为集合创建并行流(内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求)
Stream可以通过集合数组创建。
1、通过 java.util.
Collection
.stream() 方法用集合创建流
// 创建一个list
List<String> list = Arrays.asList(“a”, “b”, “c”);
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();
除了直接创建并行流,还可以通过 parallel()把顺序流转换成并行流:
Optional<Integer> findFirst = list.stream().parallel().filter(x->x>6).findFirst();
2、使用 java.util.Arrays.stream(T[]array)方法用数组创建流
int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);
四、Stream的方法使用
1、使用 Stream的静态方法:of()、iterate()、generate()、limit
// 输出包含1、2、3的
IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);
// 范围过滤,输出1,2
IntStream.range(1, 3).forEach(System.out::println);
// 范围过滤,输出1,2,3
IntStream.rangeClosed(1, 3).forEach(System.out::println);
// iterate循环迭代,进行加3计算,限制4条。limit用于限制条数
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println);
// 用于生成一个无限连续的无序流,流中的元素由用户定义的supplier函数生成,限制3条。如果不限制会一直。。。
Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);
2、map 方法用于映射每个元素到对应的结果
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
squaresList.forEach(System.out::println);
3、filter方法用于通过设置的条件过滤出元素。
List<String> strings = Arrays.asList(“1”, “2”, “3”, “”, “5”,””, “6”);
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();
System.out.println(count);
4、sorted用于对流进行排序
// 排序后输出2、3、5
IntStream.of(new int[]{5, 2, 3}).sorted().forEach(System.out::println);
5、Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串
List<String> strings = Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,””, “jkl”);
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println(“筛选列表: ” + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(“, “));
System.out.println(“合并字符串: ” + mergedString);
}
6、统计
一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println(“列表中最大的数 : ” + stats.getMax());
System.out.println(“列表中最小的数 : ” + stats.getMin());
System.out.println(“所有数之和 : ” + stats.getSum());
System.out.println(“平均数 : ” + stats.getAverage());
参考资料:
Java8中的Stream API详解:Stream的背景及使用_书呆子Rico的博客-CSDN博客_java stream