在Java 8中,可以使用Stream API和Collectors.groupingBy()方法对对象列表进行分组,并将子组减少到不同的对象中。
首先,我们需要定义一个对象类,假设为Person类,具有name和age属性:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and setters
}
接下来,假设我们有一个Person对象列表,我们想要按照年龄进行分组,并将每个年龄组中的Person对象的姓名组成一个新的对象。
List<Person> personList = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 30)
);
使用Stream API和Collectors.groupingBy()方法,可以按照年龄进行分组,并将每个年龄组中的Person对象的姓名组成一个新的对象:
Map<Integer, List<String>> groupedMap = personList.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.toList())));
上述代码中,groupingBy()方法的第一个参数指定了分组的条件,这里使用了Person对象的年龄。第二个参数使用mapping()方法,将每个分组中的Person对象转换为姓名,并使用toList()方法将姓名列表收集到一个新的List中。最终,我们得到了一个Map,其中键是年龄,值是对应年龄组中的姓名列表。
如果想要进一步减少子组到不同的对象中,可以使用Collectors.toMap()方法。假设我们想要将每个年龄组中的姓名列表转换为一个新的对象,其中对象的属性包括年龄和姓名列表:
Map<Integer, Person> reducedMap = personList.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.mapping(Person::getName, Collectors.toList())))
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> new Person(entry.getKey().toString(), entry.getValue().toString())));
上述代码中,我们首先使用entrySet()方法将Map转换为一个包含键值对的流。然后,使用toMap()方法将每个键值对转换为一个新的Person对象,其中年龄属性使用键的字符串表示,姓名列表属性使用值的字符串表示。
这样,我们就完成了在Java 8中对对象列表进行分组并将子组减少到不同的对象中的操作。
推荐的腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云