假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?
问题解释:你有一个嵌套的集合,想要通过 Stream 流的方式将其中嵌套的集合放到一个新的集合中。可以使用 flatMap
方法来实现。这种方法非常适合处理嵌套集合的情况。
Stream API(流式处理API)
是Java 8引入的一个功能强大的API,用于处理集合数据。它允许开发者以一种声明性的方式处理数据,使代码更为简洁、易读和高效。
流的基本操作:
-
创建流:可以通过集合、数组、文件等方式创建流。
-
中间操作:对流进行转换、筛选、排序等操作。
-
终端操作:对流进行收集、聚合、计算等最终操作。
public class FlattenNestedList {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("apple", "banana", "cherry"),
Arrays.asList("date", "elderberry"),
Arrays.asList("fig", "grape", "honeydew")
);
List<String> flattenedList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println("Flattened List: " + flattenedList);
}
}
-
定义嵌套列表: 首先定义了一个
nestedList
,其中包含了三个内部列表,每个内部列表都是一组字符串元素。 -
使用流操作: 使用
stream()
方法将nestedList
转换成一个流。 -
使用 flatMap: 调用
flatMap(List::stream)
方法,将每个内部列表映射为一个流,并将这些流合并成一个单一的流。 -
收集结果: 最后使用
collect(Collectors.toList())
将流中的所有字符串元素收集到一个新的列表flattenedList
中。
一、stream()
方法
是用于将集合(或数组)转换为一个流(Stream)的方法。
在集合类中,stream()
方法的定义如下:
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
1. 这里的 stream()
方法会返回一个流,这个流包含了集合中的所有元素。
public static <T> Stream<T> stream(T[] array) {
return StreamSupport.stream(Arrays.spliterator(array), false);
}
2. 这里的 stream()
方法接收一个数组作为参数,并返回该数组的流。
二、flatMap(List::stream)
是 Java Stream API 中的一种操作,它的作用是将流中的每个元素映射为一个流,然后将所有生成的流连接成一个流。
flatMap()
方法需要一个函数作为参数,这个函数的作用是将流中的每个元素映射为另一个流,并将这些流合并成一个单一的流。具体来说,它的参数是一个 Function
接口,该接口定义了如何将流中的元素映射为流。
flatMap()
方法的参数通常是一个 lambda 表达式或者方法引用,用来生成一个新的流。
- 使用 Lambda 表达式:
List<List<String>> list = Arrays.asList(
Arrays.asList("apple", "banana"),
Arrays.asList("cherry", "date"),
Arrays.asList("elderberry", "fig")
);
List<String> flattenedList = list.stream()
.flatMap(innerList -> innerList.stream())
.collect(Collectors.toList());
在这个例子中,flatMap()
方法的参数 innerList -> innerList.stream()
是一个 lambda 表达式,它将每个内部的 List<String>
转换为一个流。
2. 使用方法引用:
List<String> flattenedList = list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
这里的 List::stream
是一个方法引用,它直接引用了 List
接口中的 stream()
方法,作为映射函数的实现。
无论是 lambda 表达式还是方法引用,它们都需要符合 Function
接口的签名:接受一个输入参数(流中的元素),并返回一个输出(另一个流)。
三、collect()
方法
是 Stream API 中的一个终端操作,用于将流中的元素收集到一个结果容器中,比如集合(List、Set)、映射(Map)、字符串(String)等。它接收一个 Collector
参数,定义了如何执行收集操作。一般来说,collect()
方法可以帮助将流中的元素转换、组合、重组成需要的数据结构或形式。
Collector 接口
Collector
接口定义了一组用来管理流的元素的操作的方法。它包含了四个函数:
-
supplier():创建一个新的容器,用于存放元素的中间结果。
-
accumulator():将流中的元素添加到容器中。
-
combiner():将两个部分结果合并成一个结果,用于并行流的情况。
-
finisher():对容器执行最终的转换操作,从中获取最终的结果。
在使用 collect()
方法时,可以使用 Collectors
类提供的静态工厂方法来获取常见的收集器,比如 toList()
、toSet()
、toMap()
等,以便于快速进行收集操作。
public class FlattenNestedList {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("apple", "banana", "cherry"),
Arrays.asList("date", "elderberry"),
Arrays.asList("fig", "grape", "honeydew")
);
List<String> flattenedList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println("Flattened List: " + flattenedList);
}
}