一、源码定义
Stream.map:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
Stream.flatMap:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
二、主要区别
1. 传入的函数返回类型不同
map:传入的函数返回一个单个对象。map 会将流中的每个元素转换为另一个对象,但不会改变流的结构。
flatMap:传入的函数返回一个流(Stream)。flatMap 会将流中的每个元素转换为一个流,然后将这些流合并成一个单一的流。
2. 处理嵌套结构的方式不同
map:不会展平嵌套的结构。使用 map 会生成一个嵌套的流(例如 Stream<List<T>>)。
flatMap:会展平嵌套的结构。使用 flatMap 会将嵌套的流合并成一个单一的流(例如 Stream<T>)。
三、代码示例
使用 map
假设我们有一个 List<List<Integer>>,我们使用 map 将每个内部列表转换为一个新列表:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4)
);
List<List<Integer>> mappedList = nestedList.stream()
.map(innerList -> innerList.stream().map(x -> x * 2).collect(Collectors.toList()))
.collect(Collectors.toList());
System.out.println(mappedList); // 输出: [[2, 4], [6, 8]]
}
}
使用 flatMap
同样的 List<List<Integer>>,我们使用 flatMap 将其展平为一个单一的 List<Integer>:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4)
);
List<Integer> flattenedList = nestedList.stream()
.flatMap(List::stream) // 将每个内部列表转换为一个流,并合并这些流
.map(x -> x * 2) // 对每个元素进行操作
.collect(Collectors.toList());
System.out.println(flattenedList); // 输出: [2, 4, 6, 8]
}
}
四、总结
map:适用于将流中的每个元素转换为另一个对象,但不会改变流的结构。
flatMap:适用于将流中的每个元素转换为一个流,并将这些流合并成一个单一的流,从而展平嵌套的结构。
3740

被折叠的 条评论
为什么被折叠?



