Collector.groupingBy可以将一个对象列表按照对象的两个属性进行分组吗(两个属性值都相同的对象为一组)
时间: 2024-09-13 12:10:41 浏览: 107
根据某个属性对List中的所有对象分组,该属性值相同的对象分到一个组
是的,`Collector.groupingBy` 可以用于按照对象的多个属性进行分组。在 Java 中,你可以使用 `groupingBy` 收集器,配合 `concurrentMap`, `map` 或者 `Classification` 类的 `classifier` 方法,来实现复杂的分组逻辑。
为了按照两个属性对对象列表进行分组,你可以在 `groupingBy` 的分类器中使用一个组合键。例如,如果你有一个 `Person` 类,它有两个属性 `age` 和 `gender`,你可以创建一个新的类或者使用一个简单的 `Pair` 类来代表这两个属性的组合,然后使用这个组合作为分组的键。
以下是一个简单的例子,展示了如何根据 `Person` 对象的两个属性 `age` 和 `gender` 进行分组:
```java
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
// 假设这是你的 Person 类
class Person {
private int age;
private String gender;
// 构造器、getter 和 setter 省略
public Person(int age, String gender) {
this.age = age;
this.gender = gender;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
// 如果使用 Pair 作为组合键,需要重写 equals 和 hashCode 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(gender, person.gender);
}
@Override
public int hashCode() {
return Objects.hash(age, gender);
}
}
// 这个类用于存储分组信息
class PersonGroup {
private int age;
private String gender;
private List<Person> persons;
// 构造器、getter 和 setter 省略
}
public class GroupingExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person(20, "Male"),
new Person(20, "Male"),
new Person(30, "Female"),
new Person(20, "Female"),
// ... 更多的 Person 对象
);
Map<Pair<Integer, String>, List<Person>> groupedByAgeAndGender = people.stream()
.collect(Collectors.groupingBy(person ->
new Pair<>(person.getAge(), person.getGender())
));
// 如果你选择使用 PersonGroup 作为分组的类型
Map<PersonGroup, List<Person>> groupedByAgeAndGenderWithPersonGroup = people.stream()
.collect(Collectors.groupingBy(person -> {
PersonGroup group = new PersonGroup();
group.setAge(person.getAge());
group.setGender(person.getGender());
return group;
}));
}
}
```
在这个例子中,我们首先创建了一个 `Person` 类,它有两个属性:`age` 和 `gender`。然后,我们创建了一个 `Map`,它的键是 `Pair` 对象,这个 `Pair` 对象由 `Person` 对象的 `age` 和 `gender` 组成。这样,具有相同 `age` 和 `gender` 的 `Person` 对象就会被分到同一个组中。
请注意,为了使 `Pair` 适合作为 `Map` 的键,你需要确保 `Pair` 类重写了 `equals` 和 `hashCode` 方法。如果不想这么做,你也可以自定义一个类或者使用其他方法来生成唯一的分组键。
阅读全文