好的,阿杰,我们来“一眼看穿” 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