日期范围内持仓数据求和问题求助(附错误代码)
解决持仓数据日期范围求和的代码问题
代码存在的核心问题
- 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
相关产品推荐
相关产品推荐

