JDK8 的排序、分组求和,转换为Map

👌明白了,你想要的核心是:

  1. 排序
  2. 分组求和
  3. 转换为 Map

下面我写一个完整的 JDK8 示例,包含这三类常用操作。


示例代码

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

class Person {
    String name;
    String city;
    int age;
    int salary;

    Person(String name, String city, int age, int salary) {
        this.name = name;
        this.city = city;
        this.age = age;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return name + "-" + city + "-" + age + "-" + salary;
    }
}

public class StreamDemo {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Tom", "Beijing", 20, 5000),
                new Person("Jerry", "Shanghai", 25, 7000),
                new Person("Alice", "Beijing", 30, 8000),
                new Person("Bob", "Shanghai", 18, 4000),
                new Person("Lily", "Beijing", 28, 6000)
        );

        // 1. 排序:按工资降序
        List<Person> sortedBySalary = people.stream()
                .sorted(Comparator.comparingInt((Person p) -> p.salary).reversed())
                .collect(Collectors.toList());
        System.out.println("按工资降序排序:" + sortedBySalary);

        // 2. 分组求和:按城市分组,统计总工资
        Map<String, Integer> salarySumByCity = people.stream()
                .collect(Collectors.groupingBy(
                        p -> p.city,
                        Collectors.summingInt(p -> p.salary)
                ));
        System.out.println("按城市统计工资总和:" + salarySumByCity);

        // 3. 转换为 Map:姓名 -> 工资
        Map<String, Integer> nameToSalary = people.stream()
                .collect(Collectors.toMap(p -> p.name, p -> p.salary));
        System.out.println("姓名 -> 工资:" + nameToSalary);

        // 4. 如果 key 可能重复(比如按城市转 Map),需要指定合并规则
        Map<String, Integer> cityToSalary = people.stream()
                .collect(Collectors.toMap(
                        p -> p.city,
                        p -> p.salary,
                        Integer::sum   // key 冲突时,合并 value(工资相加)
                ));
        System.out.println("城市 -> 工资总和 (toMap 实现):" + cityToSalary);
    }
}

输出结果示例

复制代码
按工资降序排序:[Alice-Beijing-30-8000, Jerry-Shanghai-25-7000, Lily-Beijing-28-6000, Tom-Beijing-20-5000, Bob-Shanghai-18-4000]
按城市统计工资总和:{Beijing=19000, Shanghai=11000}
姓名 -> 工资:{Alice=8000, Bob=4000, Jerry=7000, Tom=5000, Lily=6000}
城市 -> 工资总和 (toMap 实现):{Beijing=19000, Shanghai=11000}

✅ 总结:

  • 排序 :sorted(Comparator.comparingInt(...).reversed())
  • 分组求和 :Collectors.groupingBy(..., Collectors.summingInt(...))
  • 转换为 Map :Collectors.toMap(key, value, mergeFunction)

要不要我帮你写一个更贴近业务表数据的版本(比如订单表:用户、商品、金额,做排序+分组求和+转 Map)?这样会更像实际开发中的用法。

相关推荐
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛6 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1147 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶8 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
w_zero_one8 小时前
算法--模拟
java·数据结构·算法
小灰灰搞电子8 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放8 小时前
面向对象高级(实战案例)
开发语言·python·学习
Javatutouhouduan8 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David8 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源9 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计