假设有person类,有name和age属性,如何用stream流对person集合进行先按name分组再对每组内的person类按照age排序
时间: 2024-01-21 13:19:18 浏览: 101
可以使用 Java 8 中的 Stream API,先使用 `Collectors.groupingBy()` 方法按照 name 属性分组,再使用 `Collectors.mapping()` 方法将每个分组内的元素映射为 age 属性,最后使用 `Collectors.toList()` 方法将每个分组内的元素按照 age 排序并转换为列表。
代码示例:
```java
import java.util.*;
import java.util.stream.Collectors;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 20),
new Person("David", 25),
new Person("Eve", 20)
);
Map<String, List<Person>> groups = people.stream()
.collect(Collectors.groupingBy(Person::getName));
Map<String, List<Person>> sortedGroups = new LinkedHashMap<>();
groups.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(entry -> {
List<Person> sortedPeople = entry.getValue().stream()
.sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
sortedGroups.put(entry.getKey(), sortedPeople);
});
System.out.println(sortedGroups);
}
}
```
输出结果:
```
{Alice=[Person{name='Alice', age=25}], Bob=[Person{name='Bob', age=30}], Charlie=[Person{name='Charlie', age=20}], David=[Person{name='David', age=25}], Eve=[Person{name='Eve', age=20}]}
```