当前位置: 首页 > 图灵资讯 > 技术篇> java steam分组求和取前5

java steam分组求和取前5

来源:图灵教育
时间:2023-12-10 14:25:25

Java Stream分组求和前5名

在开发过程中,经常会遇到需要对数据进行分组、求和、获得前几名的需求。在Java中,使用Stream可以很容易地实现这个功能。本文将介绍如何使用Java Stream分组求和,获得前五名示例。

Java是什么? Stream

Java Stream是Java 8引入的一种新的抽象层用于处理集合数据。Stream允许我们以声明的方式处理数据,使代码更简单、更容易读取。Stream提供了过滤、映射、排序、聚合等多种操作,可以大大提高开发效率。

示例需求

假设我们有一组学生的成绩数据,包括学生的姓名和相应的成绩,我们需要分组和解成绩,并获得前五名学生的成绩。

首先,让我们来看看数据的结构:

public class Student {    private String name;    private int score;    // 结构方法,getter和setter省略}
示例代码

首先,我们需要创建一些模拟学生成绩的测试数据:

List<Student> students = new ArrayList<>();students.add(new Student("Alice", 80));students.add(new Student("Bob", 70));students.add(new Student("Cindy", 90));students.add(new Student("David", 85));students.add(new Student("Emily", 95));students.add(new Student("Frank", 75));students.add(new Student("Gina", 88));students.add(new Student("Henry", 79));students.add(new Student("Ivy", 92));students.add(new Student("Jack", 87));

接下来,我们可以使用Stream进行分组求和操作,并取得前五名学生的成绩:

Map<String, Integer> sumByStudent = students.stream()        .collect(Collectors.groupingBy(Student::getName, Collectors.summingInt(Student::getScore)));List<String> topFiveStudents = sumByStudent.entrySet().stream()        .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())        .limit(5)        .map(Map.Entry::getKey)        .collect(Collectors.toList());

代码解析:

  1. 首先,我们使用它stream()该方法将学生成绩数据转换为Stream。
  2. 然后,使用groupingBy()该方法将学生姓名分组,并使用它summingInt()方法求和学生成绩。
  3. 接着,使用entrySet()该方法将分组求和结果转换为Entry的Stream。
  4. 使用sorted()该方法对学生成绩进行降序排序。
  5. 使用limit()获得前五名学生的方法。
  6. 最后,使用map()该方法将Entry转换为学生姓名并使用toList()该方法将结果转换为List。
序列图

以下是用Mermaid语法绘制的序列图,显示代码的执行过程:

sequenceDiagram    participant Students    participant Stream    participant sumByStudent    participant topFiveStudents    Students->>Stream: students.stream()    Stream->>sumByStudent: groupingBy(Student::getName, summingInt(Student::getScore))    sumByStudent->>topFiveStudents: entrySet().stream()    topFiveStudents->>topFiveStudents: sorted(comparingByValue().reversed()).limit(5).map(Map.Entry::getKey).collect(toList())
饼状图

接下来,我们用Mermaid语法绘制饼状图,展示前五名学生成绩的分布:

pie    title 前五名学生成绩分布    "Alice": 80    "Cindy": 90    "Emily": 95    "Ivy": 92    "Gina": 88
总结

本文介绍了如何使用Java Stream分组求和,获得前五名示例。通过使用Stream的丰富操作,我们可以简单高效地处理集合数据。同时,使用Mermaid语法可以轻松地绘制序列图和饼状图,更好地显示代码的执行过程和结果。希望这篇文章能理解Java 有助于Stream的分组求和操作。