在Java中,flatMap
是Stream API的一个中间操作,它可以将一个流中的每个元素转换成另一个流,然后将所有新生成的流连接成一个单一的流。这个操作通常用于处理嵌套的集合结构,比如List<List<T>>
或类似的复杂结构,以便将它们"扁平化"为Stream<T>
。
作用
flatMap
的作用是将流中的每个元素映射到一个流上,并将所有映射生成的流"扁平化"成一个流。
使用场景
- 当你有一个包含集合的集合(例如列表的列表),并且你想要创建一个包含所有子集合元素的流时。
- 当你想要将多个流合并成一个流,并在合并的过程中去除流的层级结构时。
如何工作
flatMap
需要一个函数作为参数。这个函数会被应用到流中的每个元素上,函数的返回值必须是一个流的类型。然后flatMap
会把函数返回的所有流中的元素合并到一个新的流中。
示例
假设我们有一个List<List<String>>
,我们想要获得所有字符串的流:
List<List<String>> nestedLists = Arrays.asList(Arrays.asList("a", "b", "c"),Arrays.asList("d", "e", "f"),Arrays.asList("g", "h", "i")
);Stream<String> flatStream = nestedLists.stream().flatMap(Collection::stream);flatStream.forEach(System.out::println); // 输出 a 到 i 的所有字母
在这个例子中,每个内部列表通过调用Collection::stream
被转换成了一个流,然后flatMap
将这些流合并成一个流。
与 map 的比较
map
和flatMap
的区别在于它们处理返回值的方式。map
将流中的每个元素映射到一个新的元素,而flatMap
将每个元素映射到一个流,然后将所有流中的元素合并到一个流中。
使用map
的结果可能是Stream<Stream<T>>
,而使用flatMap
的结果是Stream<T>
。
总结
flatMap
是一个强大的操作,可以用来处理流中的嵌套结构,并将它们扁平化为一个更简单的流。这使得在处理复杂的数据结构时,我们可以更容易地应用各种流操作,如filter
、map
和collect
。