news 2026/9/6 6:57:36

jdk8 判断区间重合情况实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jdk8 判断区间重合情况实例

根据你的需求,需要判断dto中的时间区间是否与列表中任何一条记录的时间区间存在重叠。时间区间重叠的判断逻辑是:两条记录的时间区间有交集


一、时间区间重叠的判断逻辑

假设两条记录的时间区间分别为:

  • 现有记录:[existingStart, existingEnd]

  • 新记录:[newStart, newEnd]

存在重叠的条件

text

newStart < existingEnd AND newEnd > existingStart

二、完整方法实现

java

private CommonResult checkSaveData(VehicleDriverDispatchDTO dto) { // 1. 查询该车在相同组织机构、相同调派人员下的所有记录 List<VehicleDriverDispatch> vehicleDriverDispatches = this.lambdaQuery() .eq(VehicleDriverDispatch::getOrganizationId, dto.getOrganizationId()) .eq(VehicleDriverDispatch::getPlateNumber, dto.getPlateNumber()) .eq(VehicleDriverDispatch::getDispatchPersonId, dto.getDispatchPersonId()) .list(); // 2. 判断是否存在时间重叠 boolean isOverlap = vehicleDriverDispatches.stream() .anyMatch(existing -> isTimeOverlap( dto.getStartTime(), dto.getEndTime(), existing.getStartTime(), existing.getEndTime() )); // 3. 返回结果 return isOverlap ? CommonResult.failed("检测到与列表中调派时间有重合,请修改后重新保存") : CommonResult.success(); } /** * 判断两个时间区间是否有重叠 * * @param newStart 新记录开始时间 * @param newEnd 新记录结束时间 * @param existingStart 已有记录开始时间 * @param existingEnd 已有记录结束时间 * @return true-有重叠,false-无重叠 */ private boolean isTimeOverlap(LocalDateTime newStart, LocalDateTime newEnd, LocalDateTime existingStart, LocalDateTime existingEnd) { // 任一时间为空,视为不重叠 if (newStart == null || newEnd == null || existingStart == null || existingEnd == null) { return false; } // 重叠条件:新开始 < 旧结束 AND 新结束 > 旧开始 return newStart.isBefore(existingEnd) && newEnd.isAfter(existingStart); }

三、边界情况说明

场景示例是否重叠
新记录完全在已有记录之前已有[10:00, 12:00],新[08:00, 09:00]❌ 不重叠
新记录完全在已有记录之后已有[10:00, 12:00],新[13:00, 14:00]❌ 不重叠
新记录与已有记录有部分重叠已有[10:00, 12:00],新[11:00, 13:00]✅ 重叠
新记录完全包含已有记录已有[10:00, 12:00],新[09:00, 13:00]✅ 重叠
新记录被已有记录包含已有[10:00, 12:00],新[10:30, 11:30]✅ 重叠
新记录开始时间等于已有记录结束时间已有[10:00, 12:00],新[12:00, 13:00]❌ 不重叠

四、如果考虑id去重(更新场景)

如果是更新操作,需要排除自身:

java

private CommonResult checkSaveData(VehicleDriverDispatchDTO dto) { List<VehicleDriverDispatch> vehicleDriverDispatches = this.lambdaQuery() .eq(VehicleDriverDispatch::getOrganizationId, dto.getOrganizationId()) .eq(VehicleDriverDispatch::getPlateNumber, dto.getPlateNumber()) .eq(VehicleDriverDispatch::getDispatchPersonId, dto.getDispatchPersonId()) // 如果是更新,排除自身 .ne(dto.getId() != null, VehicleDriverDispatch::getId, dto.getId()) .list(); boolean isOverlap = vehicleDriverDispatches.stream() .anyMatch(existing -> isTimeOverlap( dto.getStartTime(), dto.getEndTime(), existing.getStartTime(), existing.getEndTime() )); return isOverlap ? CommonResult.failed("检测到与列表中调派时间有重合,请修改后重新保存") : CommonResult.success(); }

五、总结

场景代码
判断两个区间是否重叠newStart < existingEnd && newEnd > existingStart
避免 null 导致 NPEisTimeOverlap方法中判空
更新时排除自身.ne(dto.getId() != null, VehicleDriverDispatch::getId, dto.getId())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 12:02:28

STM32WLE5CCU6 LoRaWAN FUOTA移植实战:从外置SX1262到单芯片的踩坑指南

接到这个任务的时候&#xff0c;我手头正好有一块原来跑在“STM32L0 外置SX1262”分立方案上的LoRaWAN设备&#xff0c;上面已经实现了基于LoRaWAN的FUOTA无线固件升级。新方案想换成STM32WLE5CCU6&#xff0c;也就是ST那颗把Cortex-M4和subGHz收发器集成在同一个封装里的单芯…

作者头像 李华
网站建设 2026/9/6 1:39:07

ISM330DLC三线SPI模式实战:从接线到STM32驱动

最近在调一个基于ISM330DLC的六轴姿态监测方案&#xff0c;板子空间吃紧&#xff0c;GPIO数量被压缩到极限。I2C要两根线&#xff0c;4线SPI要四根线&#xff0c;算来算去手上的接口都不够用。后来把心一横&#xff0c;直接走3 wire SPI mode&#xff0c;把ISM330DLC的SPI接口砍…

作者头像 李华
网站建设 2026/9/5 20:17:21

SR5E1E7定制板Flash烧录指南:从启动原理到实战排错

最近在折腾SR5E1E7的定制板&#xff0c;核心问题非常具体&#xff1a;如何把编译好的程序加载到片内FLASH里。SR5E1E7是ST面向车规应用的一颗MCU&#xff0c;基于Arm Cortex-M7内核&#xff0c;集成了大容量嵌入式Flash&#xff0c;而Custom Board的麻烦在于&#xff0c;它不像…

作者头像 李华
网站建设 2026/9/4 12:51:22

搜索API评测:用NEEDLE基准量化错误重叠度

在搜索 API 的日常接入和选型中&#xff0c;我们通常更关注正常查询下的响应速度、召回质量和结果排序&#xff0c;对“错误”却往往只做最低限度的可用性监控。直到我连续对比了多款搜索 API 的异常现象后才发现&#xff0c;不同厂商、不同实现路径的接口&#xff0c;在请求参…

作者头像 李华
网站建设 2026/9/5 18:07:45

STM32MP235启动失败排查:MPU调试避坑指南

我是做嵌入式Linux开发的&#xff0c;这几年经手的板子从MCU到MPU换了好几代&#xff0c;但要说调试过程中最让人头疼的&#xff0c;还是“上电之后啥反应都没有”这种问题。前阵子手头一块基于STM32MP235的核心板&#xff0c;就让我结结实实折腾了两天。板子是新的&#xff0c…

作者头像 李华
网站建设 2026/9/4 6:29:45

STM32H563 + ThreadX 嵌套中断随机崩溃:排查与修复

最近在调试一块基于 STM32H563 的板子&#xff0c;ThreadX 跑着二十多个线程&#xff0c;外设中断也有七八路&#xff0c;平时都非常稳。结果加了一路高优先级中断之后&#xff0c;系统开始随机 HardFault。最诡异的地方在于&#xff1a;只要这路高优先级中断嵌套进另一路低优先…

作者头像 李华