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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:54:03