使用 Java Stream 实现多表关联下的平均值计算与排序

使用 java stream 实现多表关联下的平均值计算与排序

本文旨在介绍如何利用 Java Stream API,针对多表关联数据,计算平均值并进行排序。通过实际案例,演示如何从用户、电影和评分数据中,找出平均评分最高的 5 部电影,并按照预算进行降序排列。文章将提供详细的代码示例和步骤说明,帮助读者掌握 Java Stream 在复杂数据处理场景下的应用。

使用 Java Stream 处理多表关联数据

在实际应用中,经常会遇到需要关联多个表的数据进行分析和处理的情况。Java Stream API 提供了强大的功能,可以方便地进行数据过滤、转换、聚合和排序。本文将通过一个具体的例子,演示如何使用 Java Stream API,从用户、电影和评分三个表中,找出平均评分最高的 5 部电影,并按照预算进行降序排列。

数据模型

首先,定义三个数据模型:User、Movie 和 Score。

record User(int id, String name) {}record Movie(int id, String name, int budget) {}record Score(int userId, int movieId, int score) {}

示例数据

接下来,创建一些示例数据,用于演示 Stream API 的使用。

立即学习“Java免费学习笔记(深入)”;

List movies = List.of(    new Movie(101, "Mov 1", 200),    new Movie(102, "Mov 2", 500),    new Movie(103, "Mov 3", 300));List scores = List.of(    new Score(1, 101, 7),    new Score(2, 101, 8),    new Score(1, 102, 6),    new Score(2, 102, 9));

使用 Stream API 计算平均评分并排序

核心逻辑是使用 scores 列表,按照 movieId 进行分组,计算每个电影的平均评分,然后按照平均评分降序排列,最后取前 5 部电影,并按照预算降序排列。

Map movieMap = movies.stream()    .collect(Collectors.toMap(Movie::id, Function.identity()));List top5 = scores.stream()    .collect(Collectors.groupingBy(        Score::movieId, Collectors.averagingDouble(Score::score)))    .entrySet().stream()    .sorted(Collections.reverseOrder(Entry.comparingByValue()))    .limit(5)    .map(e -> movieMap.get(e.getKey()))    .sorted(Collections.reverseOrder(Comparator.comparing(Movie::budget)))    .toList();top5.forEach(System.out::println);

代码解释:

movieMap 的创建: 将 movies 列表转换为一个 Map,key 为 movieId,value 为 Movie 对象本身。这方便后续通过 movieId 查找对应的 Movie 对象。scores.stream(): 从 scores 列表创建一个 Stream。collect(Collectors.groupingBy(…)): 使用 groupingBy 收集器,按照 Score::movieId 对评分进行分组,并使用 averagingDouble(Score::score) 计算每个电影的平均评分。结果是一个 Map,key 为 movieId,value 为平均评分。.entrySet().stream(): 将 Map 转换为一个 Stream<Map.Entry>,方便进行排序。sorted(Collections.reverseOrder(Entry.comparingByValue())): 按照平均评分降序排列。Entry.comparingByValue() 返回一个比较器,用于比较 Map.Entry 的 value(即平均评分)。Collections.reverseOrder() 将比较器反转,实现降序排列。limit(5): 取前 5 部电影。map(e -> movieMap.get(e.getKey())): 使用 movieMap,将 movieId 转换为对应的 Movie 对象。sorted(Collections.reverseOrder(Comparator.comparing(Movie::budget))): 按照电影的预算降序排列。toList(): 将 Stream 转换为一个 List。top5.forEach(System.out::println): 打印结果。

完整代码示例

import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.function.Function;import java.util.stream.Collectors;import java.util.Map.Entry;public class StreamExample {    record User(int id, String name) {}    record Movie(int id, String name, int budget) {}    record Score(int userId, int movieId, int score) {}    public static void main(String[] args) {        List movies = List.of(            new Movie(101, "Mov 1", 200),            new Movie(102, "Mov 2", 500),            new Movie(103, "Mov 3", 300));        List scores = List.of(            new Score(1, 101, 7),            new Score(2, 101, 8),            new Score(1, 102, 6),            new Score(2, 102, 9));        Map movieMap = movies.stream()            .collect(Collectors.toMap(Movie::id, Function.identity()));        List top5 = scores.stream()            .collect(Collectors.groupingBy(                Score::movieId, Collectors.averagingDouble(Score::score)))            .entrySet().stream()            .sorted(Collections.reverseOrder(Entry.comparingByValue()))            .limit(5)            .map(e -> movieMap.get(e.getKey()))            .sorted(Collections.reverseOrder(Comparator.comparing(Movie::budget)))            .toList();        top5.forEach(System.out::println);    }}

注意事项

确保数据模型的定义清晰,并与实际数据结构一致。理解 Stream API 的各个操作符的含义和作用,例如 groupingBy、averagingDouble、sorted、limit 和 map 等。注意 Stream 操作的顺序,不同的顺序可能会影响结果。在处理大量数据时,可以考虑使用并行 Stream,以提高性能。例如,可以使用 scores.parallelStream() 创建一个并行 Stream。

总结

本文介绍了如何使用 Java Stream API,针对多表关联数据,计算平均值并进行排序。通过一个具体的例子,演示了如何从用户、电影和评分三个表中,找出平均评分最高的 5 部电影,并按照预算进行降序排列。掌握 Stream API 可以方便地进行数据分析和处理,提高开发效率。

以上就是使用 Java Stream 实现多表关联下的平均值计算与排序的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/79533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月15日 09:47:35
下一篇 2025年11月15日 10:13:00

相关推荐

发表回复

登录后才能评论
关注微信