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
相关产品推荐
相关产品推荐

