stream流取一组数据分组后某个字段的最大的一组数据
时间: 2025-03-12 20:13:16 浏览: 10
使用Stream API实现分组并获取每组中指定字段最大值的对象
对于给定的需求,可以利用Collectors.groupingBy()
结合Collectors.maxBy()
来完成这一操作。具体来说,在Java Streams框架下,先通过groupingBy
依据特定属性进行分组,再针对每一个分组应用maxBy
比较器找出该分组里基于某个字段的最大值所对应的那个实体对象。
例如,假设有一个名为BlogPost
的类,其中包含类型(type
)和点赞数(likesCount
)两个主要字段,则可以通过如下方式获得每个类别下的最高赞文章:
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
public class BlogPost {
private String type;
private int likesCount;
// 构造函数、getter 和 setter 方法省略
@Override
public String toString() {
return "BlogPost{" +
"type='" + type + '\'' +
", likesCount=" + likesCount +
'}';
}
public static void main(String[] args) {
List<BlogPost> posts = Arrays.asList(
new BlogPost("tech", 10),
new BlogPost("life", 20),
new BlogPost("tech", 30),
new BlogPost("science", 40),
new BlogPost("life", 5)
);
Map<String, Optional<BlogPost>> result =
posts.stream()
.collect(Collectors.groupingBy(
BlogPost::getType,
Collectors.maxBy(Comparator.comparingInt(BlogPost::getLikesCount))
));
// 打印结果
result.forEach((key,value)-> System.out.println(key+" : "+ value.orElse(null)));
}
}
上述代码片段展示了如何使用流API对博客帖子列表按类型分类,并找到每一类中最受欢迎的一篇帖子[^1]。
关键点解释:
Collectors.groupingBy(Function<? super T, ? extends K> classifier)
用于创建一个新的收集器实例,它会根据传入的功能接口参数(即分类标准)来进行分组。Collectors.maxBy(Comparator<? super T> comparator)
用来寻找集合中的最大项;这里我们传递了一个自定义的比较逻辑,它是基于BlogPost
类型的likesCount
成员变量构建而成的。- 结果是一个映射表,其键为分组依据(这里是博客类型),而值则是在相应分组内的所有项目之中具有最大点赞数量的那一项——注意这里的值可能是空的情况,因此采用了
Optional<T>
作为容器类型以安全地表示可能不存在的结果。
相关推荐


















