在Java中,Stream
API 提供了强大的数据处理功能,包括分组(groupBy
)、排序(sorted
)和限制结果数量(limit
)。下面是如何使用Java streams在groupBy
之后应用排序和限制的步骤和示例代码。
这种组合通常用于需要对数据进行分组,并且对每个分组的结果进行排序和限制数量的场景,例如:
假设我们有一个Person
类,包含姓名、年龄和城市属性,我们想要按城市分组,并找出每个城市中年龄最大的两个人。
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
private String city;
// 构造函数、getter和setter省略
public Person(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
public String getCity() {
return city;
}
public int getAge() {
return age;
}
}
public class StreamExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30, "New York"),
new Person("Bob", 25, "New York"),
new Person("Charlie", 35, "Los Angeles"),
new Person("David", 40, "Los Angeles"),
new Person("Eve", 28, "Chicago")
);
Map<String, List<Person>> result = people.stream()
.collect(Collectors.groupingBy(Person::getCity))
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream()
.sorted(Comparator.comparingInt(Person::getAge).reversed())
.limit(2)
.collect(Collectors.toList())
));
result.forEach((city, persons) -> {
System.out.println("City: " + city);
persons.forEach(person -> System.out.println(" " + person.getName() + ", Age: " + person.getAge()));
});
}
}
Collectors.groupingBy
按城市对人员进行分组。limit(2)
限制每个分组的结果数量为2。Collectors.toMap
将处理后的分组结果收集到一个新的Map中。City: New York
Alice, Age: 30
Bob, Age: 25
City: Los Angeles
David, Age: 40
Charlie, Age: 35
City: Chicago
Eve, Age: 28
通过这种方式,你可以灵活地对数据进行分组、排序和限制,以满足不同的业务需求。
领取专属 10元无门槛券
手把手带您无忧上云