获取对象集合的某个属性的集合

本文分享了两种从对象集合中提取特定属性值的方法,并对比了它们的性能。第一种方法通过遍历集合并手动添加属性值到新集合;第二种方法利用JDK流API实现更简洁的代码。实测显示,遍历方式在相同集合长度下性能更优。

获取对象集合的某个属性的集合

获取对象集合的某个属性的集合

最近做项目用到了,要取某个对象的某个属性的集合,总结了两种方法,给大家分享一下。共同学习,共同进步。
User是一个对象,它有属性name,age。users是一个存放User的集合,需求是,要取users集合中每个对象的name属性,放入一个新的的集合中-names。

两种方法

1、遍历。遍历对象集合,把对象属性放到新的集合中。
话不多说,代码伺候。

// An highlighted block
public static void main(String[] args) {
	List<String> names = new ArrayList<String>();
	for (User user : users) {//users是一个User型集合
		names.add(user.getName());
	}
}

2、用jdk自带的功能,你只需要调用方法,就会返回一个想要的集合。代码伺候。

// An highlighted block
List<String> names = users.stream().map(item -> item.getName()).collect(Collectors.toList());

比较

对两种方法做了一个比较。同样长度的对象集合,性能方面第一种方法比较好,耗时比第二种方法要少一些。

Java 中,可以使用 **Stream API** 从对象集合中提取属性集合。这一操作主要通过 `map()` 和 `collect()` 方法实现。假设有一个 `Person` 类,并且需要从 `List<Person>` 中提取所有人的姓名(`name` 属性),可以使用如下方式: ```java List<String> nameList = personList.stream() .map(Person::getName) .collect(Collectors.toList()); ``` ### 使用 Stream 提取属性的通用方法 假设有一个对象集合 `List<T>`,需要提取其中某个属性(如 `id`、`name` 等),可以使用如下通用模式: ```java List<AttributeType> attributeList = originalList.stream() .map(Object::getAttribute) .collect(Collectors.toList()); ``` 其中: - `originalList` 是对象集合。 - `Object::getAttribute` 是方法引用,用于获取对象中的属性。 - `Collectors.toList()` 用于将提取后的属性收集为一个新的 `List`。 ### 示例代码 假设定义了一个 `Person` 类如下: ```java class Person { private int id; private String name; private int age; private String role; // 构造函数、getter 和 setter public Person(int id, String name, int age, String role) { this.id = id; this.name = name; this.age = age; this.role = role; } public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } public String getRole() { return role; } } ``` 创建一个 `personList` 并提取 `name` 属性: ```java List<Person> personList = new ArrayList<>(); personList.add(new Person(1, "宋圆圆", 25, "技术总监")); personList.add(new Person(2, "李师师", 23, "技术专家")); personList.add(new Person(3, "柳如是", 22, "产品经理")); List<String> names = personList.stream() .map(Person::getName) .collect(Collectors.toList()); System.out.println(names); // 输出:[宋圆圆, 李师师, 柳如是] ``` ### 进阶操作:提取多个属性并转换为 Map 如果需要将对象集合转换为 `Map`,例如以 `id` 为键,`name` 为值,可以使用以下方式: ```java Map<Integer, String> idToNameMap = personList.stream() .collect(Collectors.toMap(Person::getId, Person::getName)); ``` ### 注意事项 - 如果对象集合中存在重复的键(例如 `id`),使用 `Collectors.toMap()` 时会抛出异常。可以通过提供合并函数解决冲突,例如: ```java Map<Integer, String> idToNameMap = personList.stream() .collect(Collectors.toMap( Person::getId, Person::getName, (existing, replacement) -> existing // 或 (existing, replacement) -> replacement )); ``` - 如果目标是提取嵌套属性(例如对象中的集合属性),可以结合 `flatMap()` 使用,例如提取所有对象的子列表并合并为一个大列表: ```java List<SubObject> allSubObjects = mainList.stream() .flatMap(obj -> obj.getSubObjects().stream()) .collect(Collectors.toList()); ``` 上述方法可以高效地从对象集合中提取属性集合,适用于各种业务场景。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值