好的,阿杰,我们来“一眼看穿” map
和 flatMap
的区别,我用概念、图示和示例帮你快速理解。
1️⃣ 核心概念
函数 | 作用 | 输出结果 |
---|---|---|
map | 对集合或流的每个元素应用函数 | 每个元素被转换,但 结构保持不变 |
flatMap | 对集合或流的每个元素应用函数,然后 扁平化 结果 | 将嵌套结构展平成单一集合 |
2️⃣ “扁平化”理解
- map → 一对一转换
- flatMap → 一对多转换 + 扁平化
示意:
原始集合: [1, 2, 3]
map(x -> [x, x*10]):
[[1, 10], [2, 20], [3, 30]] <-- 结果是嵌套列表
flatMap(x -> [x, x*10]):
[1, 10, 2, 20, 3, 30] <-- 结果被扁平化
3️⃣ Java 示例
List<Integer> numbers = Arrays.asList(1, 2, 3);
// map
List<List<Integer>> mapped = numbers.stream()
.map(n -> Arrays.asList(n, n*10))
.collect(Collectors.toList());
System.out.println(mapped); // [[1, 10], [2, 20], [3, 30]]
// flatMap
List<Integer> flatMapped = numbers.stream()
.flatMap(n -> Arrays.asList(n, n*10).stream())
.collect(Collectors.toList());
System.out.println(flatMapped); // [1, 10, 2, 20, 3, 30]
4️⃣ Python 示例(对比)
numbers = [1, 2, 3]
# map
mapped = list(map(lambda x: [x, x*10], numbers))
print(mapped) # [[1, 10], [2, 20], [3, 30]]
# flatMap (用列表推导 + flatten)
flat_mapped = [y for x in numbers for y in [x, x*10]]
print(flat_mapped) # [1, 10, 2, 20, 3, 30]
5️⃣ 直观理解口诀
map:元素映射不拆箱 → 保持结构
flatMap:元素映射 + 拆箱 → 扁平化结构
6️⃣ 总结
map
→ 一对一转换 → 保留嵌套结构flatMap
→ 一对多转换 → 扁平化结果flatMap
=map
+flatten
发表回复