Java中Stream的map方法用于将流中每个元素按Function规则一对一转换,可提取属性、转类型、处理空值,并需结合collect等终端操作生成结果。

Java 中 Stream 的 map 方法用于将流中每个元素按指定规则转换为另一个对象,常用于提取属性或类型转换。核心是传入一个 Function<t r></t> 函数式接口实现,返回新类型的流。
提取对象的单个属性(如 String、int 等基本字段)
当需要从对象集合中批量获取某个字段(比如用户名、ID),用 map 提取 getter 返回值即可,结果是对应类型的流。
- 假设有一个
User类,含getName()和getAge()方法 -
list.stream().map(User::getName)→ 得到Stream<String> -
list.stream().map(User::getAge)→ 得到Stream<Integer>(注意自动装箱) - 可链式调用:如
.map(User::getName).filter(n -> n.length() > 2)
转换对象类型(如 User → UserDTO 或 String → Integer)
map 不仅能提取,还能做任意一对一转换,包括构造新对象、类型强转、格式化等。
- 转 DTO:
stream.map(u -> new UserDTO(u.getId(), u.getName())) - 字符串转数字:
Stream.of("1", "2", "3").map(Integer::parseInt) - 日期格式化:
stream.map(d -> d.format(DateTimeFormatter.ISO_DATE)) - 注意:若转换可能抛异常(如 parseInt 遇非数字),需自行 try-catch 或提前 filter
处理嵌套属性或空值(避免 NullPointerException)
若对象字段可能为 null,直接调用 getter 可能报 NPE。推荐在 map 中加判空逻辑。
立即学习“Java免费学习笔记(深入)”;
- 安全提取:
stream.map(u -> u != null ? u.getAddress() : null) - 更稳妥写法:
stream.filter(Objects::nonNull).map(User::getAddress) - 嵌套字段(如 user.getProfile().getEmail())建议先判 profile 是否为空,再取 email
- 也可用 Optional 包裹:
stream.map(u -> Optional.ofNullable(u).map(User::getAddress).orElse(null))
与 collect 结合生成最终结果
map 本身不触发执行,需配合终端操作(如 collect)才能得到实际集合。
- 转 List:
stream.map(User::getName).collect(Collectors.toList()) - 转 Set:
stream.map(User::getEmail).collect(Collectors.toSet()) - 转 Map(需保证 key 不重复):
stream.collect(Collectors.toMap(User::getId, User::getName)) - 若 map 后还需去重或排序,可在 collect 前加
distinct()或sorted()
不复杂但容易忽略细节,关键是理解 map 是“一对一映射”,每次只处理一个元素,返回一个新元素;它不改变原数据,也不影响后续流的操作顺序。


















