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

Java Stream过滤指定时间段InterestRate对象结果错误如何修正

问题根因
  • 原有isSelectable筛选逻辑存在漏洞,仅校验了利率周期的起始日落在目标筛选区间内,未覆盖「利率周期起始早于目标区间起始、但周期结束日落在目标区间内/晚于目标区间起始」的重叠场景,导致2018-07-01~2018-12-31这条符合条件的记录被遗漏。
  • 实例方法isSelectable额外传入的rate参数属于冗余设计,直接调用当前实例的属性即可。
修正方案

时间段重叠的通用判断逻辑为:两个区间[aStart, aEnd]和[bStart, bEnd]存在重叠的充要条件是 a的起始 <= b的结束 且 a的结束 >= b的起始,按这个规则重写筛选逻辑即可。

修正后的代码

首先修改isSelectable方法:

// 删掉冗余的rate参数,直接用当前实例的属性
public boolean isSelectable(LocalDate compareAgainstFrom, LocalDate compareAgainstTo) {
    // 利率周期结束 >= 目标区间起始 && 利率周期起始 <= 目标区间结束
    return !this.periodEnd.isBefore(compareAgainstFrom) && !this.periodFrom.isAfter(compareAgainstTo);
}

然后修改main方法里的filter调用,去掉多余的参数:

List<InterestRate> collection = lio.stream()
        .filter(s -> s.isSelectable(compareAgainstFrom, compareAgainstTo))
        .collect(Collectors.toList());
运行结果

修正后输出的符合条件的记录共3条,符合预期:

InterestRate{periodFrom=2018-07-01, periodEnd=2018-12-31, intersetRate=7.5}
InterestRate{periodFrom=2019-01-01, periodEnd=2019-06-30, intersetRate=9.01}
InterestRate{periodFrom=2019-07-01, periodEnd=2019-12-31, intersetRate=9.25}

内容的提问来源于stack exchange,提问作者Lovely Sakariah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:09:03