Stream流介绍
一. 什么是Stream流
Stream
将要处理的元素集合看作一种流,在流的过程中,借助Stream API
对流中的元素进行操作,比如:筛选、排序、聚合等。
Stream可以由数组或集合创建,对流的操作分为两种:
- 中间操作,每次返回一个新的流,可以有多个。
- 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。
Stream特性
- stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
- stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
- stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
二. 常用方法
1. 将集合转化为Stream流
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
2. collect --> 将Stream流转化为指定类型
转化为列表 --> collect(Collectors.toList()
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// 将Stream转化为List
List<Integer> streamList = stream.collect(Collectors.toList());
转化为Set --> collect(Collectors.toSet()
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// 将Stream转化为Set
Set<Integer> streamSet = stream.collect(Collectors.toSet());
转化为Map --> collect(Collectors.toMap()
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// 将Stream转化为Map
Map<Integer, Integer> streamMap = stream.collect(Collectors.toMap(item -> item, item2 -> item2 * 2, (item, item2) -> item + item2));
-
键映射函数(Key Mapper Function)
item -> item
- 类型:
Function<? super T, ? extends K>
,其中T
是流中元素的类型,K
是Map键的类型。 - 用法:这个函数用于从流中的每个元素生成Map的键。在你的例子中,它简单地将流中的每个元素(假设为
Integer
类型)直接用作Map的键。
- 类型:
-
值映射函数(Value Mapper Function)
item2 -> item2 * 2
- 类型:
Function<? super T, ? extends V>
,其中T
是流中元素的类型,V
是Map值的类型。 - 用法:这个函数用于从流中的每个元素生成Map的值。在你的例子中,它将流中的每个元素(假设为
Integer
类型)乘以2,并将结果作为Map的值。
- 类型:
-
合并函数(Merge Function)
(item, item2) -> item + item2
- 类型:
BinaryOperator<V>
,其中V
是Map值的类型。 - 用法:这个函数用于解决键冲突。如果两个或多个流元素通过键映射函数映射到同一个键上,那么这些元素的值(通过值映射函数生成)就需要被合并成一个值。合并函数接受两个值(这里是
item
和item2
),并返回它们的合并结果。在你的例子中,如果两个元素映射到同一个键上,它们的值(即原始值的两倍)将被相加。
- 类型:
3. filter 过滤元素
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// 过滤
Stream<Integer> streamFilter = stream.filter(item -> item > 4); // {6,6}
4. map --> 将一个Stream流转化为另一个Stream流
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// map 将该Stream流转化为另一个Stream流
Stream<Object> MapStream = stream.map(item -> {
item += 2;
return item;
});
5. forEach --> 循环Stram流的每个元素
// Arrays.asList --> 创建指定值的集合
List<Integer> list = Arrays.asList(1, 6, 6);
// 将集合转化为Stream流
Stream<Integer> stream = list.stream();
// map 将该Stream流转化为另一个Stream流
Stream<Object> MapStream = stream.map(item -> {
item += 2;
return item;
});
MapStream.forEach(item-> System.out.println(item));