使用Java Stream实现多条件过滤、按月分组与数据汇总

使用java stream实现多条件过滤、按月分组与数据汇总

本文将深入探讨如何利用Java 8及更高版本的Stream API,高效地处理复杂数据聚合任务。我们将通过一个实际案例,演示如何对数据进行多条件过滤、按日期(月份)和事件类型进行分组,并计算每个分组的总数,最终将结果转换为指定的数据传输对象,并进行排序。

1. 场景概述与数据模型

在日常开发中,我们经常需要从原始数据中提取有价值的信息。例如,我们可能需要分析员工的入职(JOIN)和离职(EXIT)事件,按月份和事件类型统计总人数。

假设我们有以下 Person 类来存储员工事件信息:

import java.time.LocalDate;public class Person {    private String id;    private String name;    private String surname;    private State event; // JOIN, EXIT (State是一个枚举类型)    private Object value; // 示例中未直接使用,但可能存在    private LocalDate eventDate;    public Person(String id, State event, LocalDate eventDate) {        this.id = id;        this.event = event;        this.eventDate = eventDate;    }    // Getters    public String getId() { return id; }    public State getEvent() { return event; }    public LocalDate getEventDate() { return eventDate; }    @Override    public String toString() {        return "Person{" +               "id='" + id + ''' +               ", event=" + event +               ", eventDate=" + eventDate +               '}';    }}

其中 State 是一个枚举类型,定义了不同的事件状态:

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

public enum State {    JOIN, EXIT, OTHER // 假设还有其他事件类型,例如OTHER}

我们的目标是生成一个 List,其中 DTO 包含月份、事件类型和该类型在当月的总人数:

public class DTO {    private int month;    private State info;    private int totalEmployees;    public DTO(int month, State info, int totalEmployees) {        this.month = month;        this.info = info;        this.totalEmployees = totalEmployees;    }    // Getters    public int getMonth() { return month; }    public State getInfo() { return info; }    public int getTotalEmployees() { return totalEmployees; }    @Override    public String toString() {        return "DTO{" +               "month=" + month +               ", info=" + info +               ", totalEmployees=" + totalEmployees +               '}';    }}

为了在分组时作为键,我们需要一个组合了月份和事件类型的数据结构。Java 16+ 推荐使用 record,它自动提供了 equals()、hashCode() 和 toString() 方法,非常适合作为不可变的数据载体:

// Java 16+ 推荐使用 recordpublic record MonthState(int month, State info) {}

如果使用 Java 8-15,则需要手动创建一个类并重写 equals() 和 hashCode() 方法,以确保分组逻辑的正确性:

// Java 8-15 版本的 MonthStateimport java.util.Objects;public class MonthState {    private final int month;    private final State info;    public MonthState(int month, State info) {        this.month = month;        this.info = info;    }    public int getMonth() { return month; }    public State getInfo() { return info; }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        MonthState that = (MonthState) o;        return month == that.month && info == that.info;    }    @Override    public int hashCode() {        return Objects.hash(month, info);    }    @Override    public String toString() {        return "MonthState{" +               "month=" + month +               ", info=" + info +               '}';    }}

以上就是使用Java Stream实现多条件过滤、按月分组与数据汇总的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 03:53:45
下一篇 2025年11月28日 03:57:21

相关推荐

发表回复

登录后才能评论
关注微信