Optional的map用于值转换并保持Optional包装,flatMap用于扁平化嵌套Optional;map适合简单转换,flatMap适合链式依赖操作且任一环节为空则终止。

Optional 的 map 用于对值做转换,返回新的 Optional;flatMap 用于处理返回 Optional 的函数,避免嵌套 Optional。
map:值转换,保持 Optional 包装
map 接收一个 Function
- 适合“有值就转换,没值就跳过”的场景
- 函数返回普通对象(非 Optional),map 自动包装成 Optional
- 不能用 map 处理返回 Optional 的函数,否则会得到 Optional<Optional<T>>
例如:Optional<String> opt = Optional.of("123");
Optional<Integer> result = opt.map(Integer::parseInt); // ✅ 正确
flatMap:扁平化嵌套 Optional
flatMap 接收一个 Function 立即学习“Java免费学习笔记(深入)”; 例如:Optional<User> userOpt = findUserById(100); 假设有一个方法 多个依赖步骤(如查用户 → 查订单 → 查商品)天然适合 flatMap 链接: 例如:userOpt
Optional<Address> addr = userOpt.flatMap(User::getAddress); // ✅ getAddr 返回 Optional<Address>常见误用对比
Optional<String> getName():
opt.map(u -> u.getName()) → 类型错误:map 期望返回 String,但 getName 返回 Optional<String>opt.map(u -> u.getName()).orElse(null) → 编译失败,因为 map 结果是 Optional<Optional<String>>opt.flatMap(User::getName) → 正确:直接得到 Optional<String>链式调用中的实际组合
.flatMap(User::getOrder)
.flatMap(Order::getProduct)
.map(Product::getName) // 这里用 map,因为 getName 返回 String


















