ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

jdk8 判断区间重合情况实例

jdk8 判断区间重合情况实例 根据你的需求需要判断dto中的时间区间是否与列表中任何一条记录的时间区间存在重叠。时间区间重叠的判断逻辑是两条记录的时间区间有交集。一、时间区间重叠的判断逻辑假设两条记录的时间区间分别为现有记录[existingStart, existingEnd]新记录[newStart, newEnd]存在重叠的条件textnewStart existingEnd AND newEnd existingStart二、完整方法实现javaprivate CommonResult checkSaveData(VehicleDriverDispatchDTO dto) { // 1. 查询该车在相同组织机构、相同调派人员下的所有记录 ListVehicleDriverDispatch 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去重更新场景如果是更新操作需要排除自身javaprivate CommonResult checkSaveData(VehicleDriverDispatchDTO dto) { ListVehicleDriverDispatch 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 导致 NPE在isTimeOverlap方法中判空更新时排除自身.ne(dto.getId() ! null, VehicleDriverDispatch::getId, dto.getId())
返回列表