Java如何实现两个LocalDate日期间的HashMap数据过滤统计
实现方案
前置说明
假设你的TransactionData类已实现getDate()方法,返回交易对应的LocalDate类型日期。如果日期字段目前还是字符串格式,需要先按以下方式解析为LocalDate:
// 定义对应日期格式的解析器,注意用英文Locale匹配月份缩写 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy", Locale.ENGLISH); // 字符串转LocalDate示例 LocalDate transDate = LocalDate.parse("21-Nov-20", dateFormatter);
修改后的代码
方案1:仅按姓名统计总金额(匹配你原始代码的统计逻辑,新增日期过滤)
import java.time.LocalDate; import java.util.Map; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; // 定义日期范围(闭区间:包含2020-11-21和2020-12-28两天) LocalDate startDate = LocalDate.of(2020, 11, 21); LocalDate endDate = LocalDate.of(2020, 12, 28); Map<String, Double> totalIExpense = datatransaction.stream() // 过滤符合日期范围的交易记录 .filter(trans -> !trans.getDate().isBefore(startDate) && !trans.getDate().isAfter(endDate)) .collect(groupingBy( TransactionData::getName, Collectors.summingDouble(TransactionData::getAmount) ));
方案2:按日期+姓名分组统计总金额(匹配你给出的预期输出格式)
如果需要得到同日期同姓名的金额汇总结果,和你贴的预期输出格式一致,只需要调整分组键即可:
// 日期范围定义和filter逻辑和上面完全一致 Map<LocalDate, Map<String, Double>> dateNameAmountSum = datatransaction.stream() .filter(trans -> !trans.getDate().isBefore(startDate) && !trans.getDate().isAfter(endDate)) .collect(groupingBy( TransactionData::getDate, groupingBy( TransactionData::getName, Collectors.summingDouble(TransactionData::getAmount) ) ));
遍历上述嵌套Map即可输出你需要的「日期+姓名+汇总金额」格式的结果。
关键逻辑说明
- 日期过滤用
!isBefore(startDate)表示日期大于等于起始日期,!isAfter(endDate)表示日期小于等于结束日期,完美匹配闭区间的过滤需求 - 金额汇总逻辑保持你原有写法即可,不需要额外调整
内容的提问来源于stack exchange,提问作者Ajit V
相关产品推荐
相关产品推荐

