stream 先分组 再取组内最大值 再取组内等于该最大值的元素
时间: 2024-09-06 12:07:25 浏览: 31
java1.8 中 stream 的 groupingBy 最大值、最小值分组
在Java中,Stream API提供了一种高效且易于理解的方式来处理集合中的数据。如果你想要先对数据进行分组,然后在每个分组中找到最大值,并最终获取所有等于该最大值的元素,你可以按照以下步骤进行:
1. 使用`Collectors.groupingBy`收集器来对数据进行分组。
2. 使用`Collectors.maxBy`收集器在每个分组中找到最大值。
3. 最后,再次使用Stream来过滤出每个分组中的最大值对应的元素。
以下是一个具体的代码示例:
```java
import java.util.*;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
// 假设有一个List,包含若干个具有特定属性的对象
List<MyObject> list = Arrays.asList(
new MyObject("A", 1),
new MyObject("A", 2),
new MyObject("B", 3),
new MyObject("B", 4),
new MyObject("B", 5)
// ... 更多对象
);
// 分组后取最大值,并获取所有最大值对应的对象
Map<String, List<MyObject>> maxObjectsByGroup = list.stream()
.collect(Collectors.groupingBy(
MyObject::getKey, // 分组依据的key
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparingInt(MyObject::getValue)), // 分组后找到最大值
optional -> optional.map(Collections::singletonList).orElse(Collections.emptyList()) // 将Optional转为List
)
));
// 输出每个分组中最大值对应的对象
maxObjectsByGroup.forEach((key, maxValuesList) -> {
System.out.println("Group: " + key + ", Max Values: " + maxValuesList);
});
}
static class MyObject {
private String key;
private int value;
public MyObject(String key, int value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public int getValue() {
return value;
}
}
}
```
在上述代码中,`MyObject`类有两个属性:`key`和`value`。我们首先根据`key`属性对`MyObject`对象列表进行分组,然后在每个分组中找到`value`最大的对象,并将其放入一个列表中。最后,我们打印出每个分组中的最大值对象列表。
阅读全文