stream流多条件分组
时间: 2023-09-25 11:15:58 浏览: 96
在Java 8中,可以使用流(Stream)和Collectors.groupingBy()方法来实现多条件分组。
假设我们有一个Person类,包含name、age和gender三个属性,我们需要按照age和gender两个属性进行分组。
首先,我们需要在Person类中重写equals()和hashCode()方法,以确保对象能够正确比较和分组。
```java
public class Person {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// getters and setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name) &&
Objects.equals(gender, person.gender);
}
@Override
public int hashCode() {
return Objects.hash(name, age, gender);
}
}
```
然后,我们可以使用Stream和Collectors.groupingBy()方法进行分组。
```java
List<Person> persons = Arrays.asList(
new Person("Alice", 20, "Female"),
new Person("Bob", 30, "Male"),
new Person("Charlie", 25, "Male"),
new Person("David", 20, "Male"),
new Person("Eva", 30, "Female")
);
Map<Integer, Map<String, List<Person>>> groupedPersons =
persons.stream().collect(Collectors.groupingBy(Person::getAge,
Collectors.groupingBy(Person::getGender)));
System.out.println(groupedPersons);
```
这里我们先按照age进行分组,然后对每个age分组内的元素再按照gender进行分组,最终得到一个嵌套的Map。输出结果如下:
```
{20={Female=[Person{name='Alice', age=20, gender='Female'}], Male=[Person{name='David', age=20, gender='Male'}]}, 25={Male=[Person{name='Charlie', age=25, gender='Male'}]}, 30={Female=[Person{name='Eva', age=30, gender='Female'}], Male=[Person{name='Bob', age=30, gender='Male'}]}}
```
可以看到,我们成功地按照两个属性进行了分组。
阅读全文