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
相关产品推荐
相关产品推荐

