Java中stream().map()通过Function接口实现对象属性转换:可提取单个属性、构造新对象或修改后重建不可变对象,需注意null安全,推荐filter预过滤或flatMap+Optional处理。

Java 中用 stream().map() 转换对象属性,核心是传入一个函数式接口 Function<t r></t>,把原对象映射成新类型或新结构的数据。
直接提取单个属性(转为简单类型)
常见于将对象列表转为 ID、名称等字段的集合:
- 假设有一个
User类,含id(Long)、name(String)字段 - 用
map(User::getName)提取所有用户名,返回Stream<String> - 链式调用
.collect(Collectors.toList())得到List<String>
List<String> names = users.stream().map(User::getName).collect(Collectors.toList());
构造新对象(转为另一个类)
适合做 DTO 转换、VO 封装等场景:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用 lambda 表达式在
map()中 new 新对象,如map(u -> new UserDTO(u.getId(), u.getName().toUpperCase())) - 也可封装为静态方法或构造器引用,提升可读性,例如
map(UserDTO::fromUser)(前提是UserDTO有对应静态工厂方法)
try-catch 或改用 flatMap + Optional 处理空值。
修改属性值后重建对象(不可变对象常用)
若原始对象是不可变类(如 record 或 final 字段),无法直接 set,需靠复制+修改实现:
立即学习“Java免费学习笔记(深入)”;
- 对每个
User,创建新实例并调整某个字段,如map(u -> new User(u.getId(), u.getName().trim())) - 若字段多、逻辑复杂,建议抽出独立转换方法,避免 map 内部臃肿
处理 null 安全与空值跳过
map() 本身不跳过 null,遇到 null 会触发 NPE。稳妥做法是提前过滤:
- 先
filter(Objects::nonNull),再 map - 或在 map 内部判空,如
map(u -> u == null ? null : u.getName())(但结果流中仍含 null) - 更推荐用
flatMap结合Optional:flatMap(u -> Optional.ofNullable(u).map(User::getName).stream()),天然剔除 null

















