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

日期范围内持仓数据求和问题求助(附错误代码)

解决持仓数据日期范围求和的代码问题

代码存在的核心问题

  • sum的初始化与作用域错误:你把sum定义在for循环内部,每次循环都会重置为null,完全没法实现累加。而且null和数值直接相加会抛出NullPointerException。
  • 日期范围判断不完整:当前只判断了日期早于结束日期,没限定日期要晚于等于起始日期,会把范围外的记录错误计入总和。
  • 强制类型转换风险:直接把filteredEndDate强转为ChronoLocalDate,如果原类型不匹配会抛出类型转换异常。

修正后的代码示例

假设filteredStartDate是每条记录对应的日期列表,且和listHoldingsDBRecords元素一一对应,同时你有指定的起始日期startDate:

// 把sum放在循环外,初始化为0L保证累加正常
Long sum = 0L;
// 替换成你的指定起始日期
ChronoLocalDate startDate = ...;
// 若filteredEndDate本身就是ChronoLocalDate类型,直接去掉强制转换
ChronoLocalDate endDate = (ChronoLocalDate) filteredEndDate;

for (int i = 0; i < filteredStartDate.size(); i++) {
    ChronoLocalDate currentDate = filteredStartDate.get(i);
    // 判断当前日期在[startDate, endDate]范围内(包含边界)
    if ((currentDate.isEqual(startDate) || currentDate.isAfter(startDate)) 
        && (currentDate.isEqual(endDate) || currentDate.isBefore(endDate))) {
        sum += listHoldingsDBRecords.get(i).getHoldings();
    }
}

优化建议

  • 可以用Java 8+的流API简化代码,更简洁易读:
Long sum = IntStream.range(0, filteredStartDate.size())
    .filter(i -> {
        ChronoLocalDate current = filteredStartDate.get(i);
        return !current.isBefore(startDate) && !current.isAfter(endDate);
    })
    .mapToLong(i -> listHoldingsDBRecords.get(i).getHoldings())
    .sum();

内容的提问来源于stack exchange,提问作者Pratik Pathare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:06:33