0

0

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

心靈之曲

心靈之曲

发布时间:2025-09-13 16:13:10

|

853人浏览过

|

来源于php中文网

原创

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

本文介绍了如何使用 Java Stream API,在关联的 User、Movie 和 Score 三张表的数据中,计算电影的平均评分,并找出平均评分最高的 5 部电影,最后按照电影预算进行降序排序。通过示例代码,详细展示了如何利用 Stream API 的 groupingBy、averagingDouble、sorted 和 limit 等操作,实现复杂的数据处理逻辑。

使用 Java Stream 处理多表关联数据并计算平均值排序

在实际开发中,经常会遇到需要从多个关联表中提取数据,进行聚合计算并排序的需求。Java Stream API 提供了强大的数据处理能力,可以简洁高效地实现这类复杂操作。以下将以 User、Movie 和 Score 三张表为例,演示如何使用 Java Stream API 计算电影平均评分,并按照评分和预算进行排序。

数据模型

首先,定义三个数据模型类,分别对应 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) {}

示例数据

为了方便演示,我们创建一些示例数据:

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

论论App
论论App

AI文献搜索、学术讨论平台,涵盖了各类学术期刊、学位、会议论文,助力科研。

下载
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, 6),
    new Score(2, 101, 8),
    new Score(1, 102, 6),
    new Score(2, 102, 9));

实现步骤

  1. 构建 Movie Map: 将 Movie 列表转换为 Map,方便后续根据 Movie ID 获取 Movie 对象。

    Map movieMap = movies.stream()
        .collect(Collectors.toMap(Movie::id, Function.identity()));
  2. 计算平均评分并排序: 使用 Stream API 对 Score 列表进行处理,计算每个电影的平均评分,并按照评分降序排序,最后取前 5 个。

    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();
    • groupingBy(Score::movieId, Collectors.averagingDouble(Score::score)): 将 Score 按照 movieId 分组,并计算每个电影的平均评分。
    • entrySet().stream(): 将 Map 转换为 Stream。
    • sorted(Collections.reverseOrder(Entry.comparingByValue())): 按照平均评分降序排序。
    • limit(5): 取前 5 个电影。
    • map(e -> movieMap.get(e.getKey())): 根据 Movie ID 从 movieMap 中获取 Movie 对象。
    • sorted(Collections.reverseOrder(Comparator.comparing(Movie::budget))): 按照电影预算降序排序。
  3. 输出结果: 将结果打印到控制台。

    top5.stream().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 MovieRanking {

    public static void main(String[] args) {
        record User(int id, String name) {}
        record Movie(int id, String name, int budget) {}
        record Score(int userId, int movieId, int score) {}

        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, 6),
            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.stream().forEach(System.out::println);
    }
}

注意事项

  • 在实际应用中,数据可能来自数据库或其他数据源,需要根据实际情况调整数据读取方式。
  • 如果数据量非常大,可以考虑使用并行 Stream 提高处理效率。
  • 代码中的 record 是 Java 16 引入的新特性,如果使用较低版本的 Java,需要使用传统的 class 定义数据模型。

总结

本文通过一个具体的例子,展示了如何使用 Java Stream API 处理多表关联数据,并进行复杂的聚合计算和排序。Stream API 的简洁性和强大的功能,可以大大简化代码,提高开发效率。掌握 Stream API 的使用,对于 Java 开发者来说至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

61

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.27

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

360

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2083

2023.08.14

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

33

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8.1万人学习

Java 教程
Java 教程

共578课时 | 54万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号