Java Stream API 的 map() 方法用于对象类型转换,接收 Function<T, R> 将每个元素映射为新对象;支持字段提取、基础类型转换、构造新对象,需注意 null 安全、避免耗时操作,并区分 map() 与 mapToInt() 等原始类型特化方法。

Java Stream API 中的 map() 方法是实现对象类型转换最常用、最直观的方式——它接收一个函数式接口 Function<T, R>,将流中每个元素按规则映射为新类型的新对象。
用 map() 做简单字段提取或类型转换
最常见场景是从对象中提取某个字段(如从 User 提取 String name),或转成另一种基础类型(如 Integer → Long)。关键在于确保 lambda 表达式或方法引用返回值类型与目标泛型 R 一致。
- 提取姓名:
stream.map(User::getName)→ 得到Stream<String> - 整数转长整型:
stream.map(Integer::longValue)→ 得到Stream<Long> - 字符串转大写:
stream.map(String::toUpperCase)→ 得到Stream<String>
用 map() 构造新对象完成类型转换
当需要将一种业务对象转为另一种(如 User → UserDTO),直接在 map() 中 new 新对象即可。推荐使用构造器引用或静态工厂方法,保持可读性和可测试性。
- 构造器引用:
stream.map(UserDTO::new)(前提是UserDTO有接受User的构造器) - 静态方法转换:
stream.map(UserDTO::fromUser)(public static UserDTO fromUser(User u)) - 匿名 lambda:
stream.map(u -> new UserDTO(u.getId(), u.getName(), u.getEmail()))
注意 null 安全和中间对象生命周期
map() 不会自动跳过 null 元素,若源流含 null,且映射逻辑未判空,运行时会抛 NullPointerException。必要时结合 filter(Objects::nonNull) 或在 lambda 内部处理。
立即学习“Java免费学习笔记(深入)”;
- 安全过滤再映射:
stream.filter(Objects::nonNull).map(User::getName) - 映射内判空:
stream.map(u -> u == null ? null : u.getName()) - 避免在
map()中做耗时操作(如远程调用、IO),它属于中间操作,应保持轻量
map() 与 mapToXxx() 的区别别混淆
map() 返回的是引用类型的 Stream<R>;而 mapToInt()、mapToLong()、mapToDouble() 返回的是原始类型特化流(IntStream 等),用于数值计算优化。二者不可混用——想转成 int 数组?用 mapToInt(User::getAge).toArray(),不是 map(u -> u.getAge())。
- 错例:
stream.map(u -> u.getAge()).collect(Collectors.toList())→ 得到List<Integer> - 对例:
stream.mapToInt(User::getAge).toArray()→ 得到int[]


















