好的,阿杰,我用 大白话 + 图解思路帮你一眼看穿 Java/Scala/Stream 中 map 和 flatMap 的区别。
map vs flatMap 一眼看懂
1️⃣ 核心概念
| 函数 | 功能 | 输出结果 | 
|---|---|---|
| map | 一对一映射 | 每个元素映射成一个新元素 | 
| flatMap | 一对多映射 + 扁平化 | 每个元素映射成一个集合/流,最终扁平成一个流 | 
2️⃣ 通俗理解
- map:把每个元素“变成别的东西”,结果是原来的大小一样
比喻:每个人穿上不同衣服,人数不变
- flatMap:把每个元素“变成一个集合”,然后把所有集合合成一个大集合
比喻:每个人可能有多个爱好,把所有人的爱好合成一个列表
3️⃣ Java Stream 示例
示例数据
List<String> names = Arrays.asList("Alice", "Bob");
map 示例
List<Integer> nameLengths = names.stream()
    .map(String::length) // 每个名字映射成长度
    .collect(Collectors.toList());
System.out.println(nameLengths); // [5, 3]
- 输入:["Alice", "Bob"]
- 输出:[5, 3]
- 元素一对一映射
flatMap 示例
假设每个人有多个爱好:
Map<String, List<String>> hobbies = new HashMap<>();
hobbies.put("Alice", Arrays.asList("reading","swimming"));
hobbies.put("Bob", Arrays.asList("running","gaming"));
List<String> allHobbies = hobbies.values().stream()
    .flatMap(List::stream) // 每个 List 扁平化成一个 Stream
    .collect(Collectors.toList());
System.out.println(allHobbies); // [reading, swimming, running, gaming]
- 输入:[["reading","swimming"], ["running","gaming"]]
- 输出:["reading","swimming","running","gaming"]
- 元素一对多映射 + 扁平化
4️⃣ 总结规律
| 方法 | 输入 | 映射结果 | 最终 Stream | 
|---|---|---|---|
| map | T | R | Stream | 
| flatMap | T | Stream | Stream(扁平化) | 
- 一句话:
map得到的是“流里套流”,flatMap得到的是“平铺的流”
5️⃣ 小技巧记忆法
- map = 一变一:元素个数不变
- flatMap = 扁平 + 展开:元素可以变多
- 思路:想象每个元素被打开,如果每个元素里还有多个东西,用 flatMap扁平化
如果你愿意,我可以帮你画一张 map vs flatMap 流程图,直观展示:
[元素1, 元素2] 
   map -> [结果1, 结果2]
   flatMap -> [结果1a, 结果1b, 结果2a, 结果2b]
发表回复