在 Java 8 及以后的版本里,Stream API 提供了非常方便的集合处理方式。当我们有个对象集合,想从中提取某一个属性并形成新的列表时,使用 Stream.map 是最直接的做法。它把流里的每个对象映射成另一个对象,再收集起来。

什么是 Stream.map
Stream.map 是一个中间操作,接收一个 Function 函数式接口作为参数。它会对流中的每一个元素应用这个函数,把元素转换成另一种类型,最终产生一个新的流。比如把 User 对象转成他的 name 字符串。
基础示例:提取对象属性到列表
假设有一个 User 类,包含 id 和 name 属性。现在我们有一组 User 对象,希望拿到所有的 name 组成一个 List<String>。
import java.util.*;
import java.util.stream.*;
class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
}
public class Demo {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User(1, "张三"),
new User(2, "李四"),
new User(3, "王五")
);
// 使用 map 提取 name 属性,再用 collect 收集为 List
List<String> names = users.stream()
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
}
}
上面代码中,User::getName 是方法引用,等价于 u -> u.getName()。map 把每个 User 变成 String,collect 负责把流里的字符串收进列表。
提取基本类型属性
如果提取的是 int 之类的基本类型,可以用 mapToInt 避免装箱开销。
List<Integer> ids = users.stream()
.map(User::getId)
.collect(Collectors.toList());
// 或者用 mapToInt
int[] idArray = users.stream()
.mapToInt(User::getId)
.toArray();
处理可能为 null 的属性
当属性可能为空时,可以在 map 里做过滤或给默认值。
List<String> safeNames = users.stream()
.map(u -> u.getName() == null ? "未知" : u.getName())
.collect(Collectors.toList());
小结
使用 Stream.map 提取对象集合中的特定属性,核心就是先调用 stream 得到流,再用 map 指定属性获取方式,最后用 collect 转成列表。这种方式代码短、可读性高,是日常 Java 开发里的常用写法。