You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8 Stream实现AssestValue按ID分组并按年月排序的方法

Java 8 Stream 实现资产值按ID分组并按年月排序

先修正实体类规范(确保Getter可用)

首先需要调整实体类的命名和字段规范,避免冲突并保证Stream能正常调用Getter方法:

public class AssestValue {
    private String date; // 避免与java.util.Date类名冲突,改为小写
    private String year;
    private IdValue idValue; // 修正类名大小写为IdValue

    // Getter & Setter
    public String getDate() { return date; }
    public void setDate(String date) { this.date = date; }
    public String getYear() { return year; }
    public void setYear(String year) { this.year = year; }
    public IdValue getIdValue() { return idValue; }
    public void setIdValue(IdValue idValue) { this.idValue = idValue; }
}

public class IdValue {
    private String id;

    // Getter & Setter
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
}

Stream分组+排序实现代码

假设你已经从数据库获取到List<AssestValue> assetValues,以下是核心实现:

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 分组并排序
Map<String, List<AssestValue>> groupedSortedAssets = assetValues.stream()
    .collect(Collectors.groupingBy(
        // 分组依据:IdValue中的id字段
        asset -> asset.getIdValue().getId(),
        // 对每个分组的列表进行排序处理
        Collectors.collectingAndThen(
            Collectors.toList(),
            assetList -> assetList.stream()
                // 先按Year排序,再按Date的年月排序
                .sorted(Comparator.comparing(AssestValue::getYear)
                    .thenComparing(AssestValue::getDate))
                .collect(Collectors.toList())
        )
    ));

特殊日期格式的排序处理

如果你的Date字段不是直接可比较的年月格式(比如是yyyyMMdd或yyyy-MM-dd),需要先提取年月信息再排序:

示例1:Date格式为yyyyMMdd(如20240512)

.sorted(Comparator.comparing(AssestValue::getYear)
    .thenComparing(asset -> asset.getDate().substring(0, 6)))

示例2:Date格式为yyyy-MM-dd(如2024-05-12)

import java.time.LocalDate;
import java.time.YearMonth;

.sorted(Comparator.comparing(AssestValue::getYear)
    .thenComparing(asset -> {
        LocalDate date = LocalDate.parse(asset.getDate());
        return YearMonth.from(date);
    }))

说明

  • Collectors.groupingBy负责按ID分组,第二个参数用于对分组后的集合做后续处理
  • Collectors.collectingAndThen先将分组元素收集为列表,再通过Stream对列表排序
  • 排序逻辑支持多级排序:优先按Year排序,再按Date的年月维度排序,完全满足报表打印的有序性需求

内容的提问来源于stack exchange,提问作者Michael Prabhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:41:09