Kotlin判断两个日期范围是否重叠 求更惯用高效的实现
Kotlin 区间重叠判断优化方案
你当前的实现是判断两个闭区间是否存在重叠,逻辑正确性没有问题,但可以从性能、语义简洁度、Kotlin生态适配三个方向做优化。
最优性能写法
区间不重叠的场景仅存在两种:
- A区间整体在B区间之前(
A.endAt < B.startAt) - A区间整体在B区间之后(
A.startAt > B.endAt)
对上述两种情况取反即可得到重叠判断逻辑,仅需最多2次比较运算,无额外对象创建,性能远高于原有3组或条件的写法,且覆盖所有重叠场景(部分相交、A包含B、B包含A):
val isOverlapped = A.endAt >= B.startAt && A.startAt <= B.endAt
你可以自行代入所有边界场景验证:
- A包含B:
A.startAt <= B.startAt且A.endAt >= B.endAt,两个判断条件均成立 - A与B左相交:
A.startAt < B.startAt且A.endAt落在B区间内,两个判断条件均成立 - A与B右相交:
A.endAt > B.endAt且A.startAt落在B区间内,两个判断条件均成立 - A完全落在B区间内:两个判断条件均成立
- 两区间无交集:两个判断条件至少有一个不成立,直接返回false
Kotlin 惯用写法
如果你的startAt、endAt是实现了Comparable接口的类型(时间类型如Long、Instant、LocalDateTime均满足该要求),可以借助Kotlin标准库的区间API提升代码可读性:
// 转为Kotlin原生闭区间 val rangeA = A.startAt..A.endAt val rangeB = B.startAt..B.endAt // Kotlin 1.5+ 可直接使用标准库的相交判断API,语义和自然语言完全一致 val isOverlapped = !rangeA.intersect(rangeB).isEmpty()
该API内部实现和上述最优性能写法逻辑完全一致,无额外性能损耗。
原有写法的额外开销说明
你原有代码中使用的in B.startAt..B.endAt语法,每次调用会临时生成一个ClosedRange实例,在高频调用场景(如批量判断万级以上区间数据)会产生不必要的对象创建压力,不建议在性能敏感路径使用。
内容的提问来源于stack exchange,提问作者MozenRath
相关产品推荐
相关产品推荐

