【问题标题】:Checking if single date does not colliding with the date list检查单个日期是否与日期列表冲突
【发布时间】:2020-03-21 23:28:51
【问题描述】:

假设我们有一个TrainingDate 类,如下所示:

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
class TrainingDate {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private LocalDateTime startDate;

  private LocalDateTime endDate;

  @OneToOne(mappedBy = "trainingDate")
  private Training training;

}

我想创建一个方法来检查建议的培训日期是否不会与培训师的时间表发生冲突。方法如下:

private boolean isTrainingDateNotCollidingWithTrainerSchedule(List<Training> trainerTrainings,
      TrainingDate potentialTrainingDate) {

    List<TrainingDate> trainingList = trainerTrainings
        .stream()
        .map(Training::getTrainingDate)
        .filter(
            trainingDate -> trainingDate.startDate.isAfter(potentialTrainingDate.endDate) &&
                trainingDate.endDate.isBefore(potentialTrainingDate.startDate))
        .collect(Collectors.toList());

    if (trainingList.size() > 1) {
      throw exception here 
    } else {
      return true;
    }
  }

看起来它工作正常,但对我来说,实现目标并不是那么温和的方式。问题来了,是否可以重构上述解决方案并使其更加清晰。我知道我可以拆分此 filter 声明,但此帖子 click 表明,如果我们要考虑最终性能,这不是一个好的选择。我将不胜感激有关如何通过提高当前解决方案的清晰度来检查start dateend date 是否不会与培训师时间表相冲突的建议。

【问题讨论】:

  • 那个条件看起来不对,一个周期怎么会在另一个周期结束之后开始,又在另一个周期开始之前结束呢?离题,但 TrainingDate 是一个奇怪的名字,它有一个开始和一个结束日期,也许使用像周期、间隔或时间表这样的东西会更好。
  • 这个方法返回什么getTrainingDate,这个属性是在TrainingDate还是Training里面?
  • 一个简单的重构是将比较移动到一个名为overlap(LocalDateTime otherstart, LocalDateTime otherend) 的方法中,该方法位于TrainingDate 类中。然后正如 Joakim 提到的,您必须将条件修复为:(startDate.isBefore(otherStart) &amp;&amp; endDate.isAfter(otherStart)) || (startDate.isBefore(otherEnd) &amp;&amp; endDate.isAfter(otherEnd));

标签: java datetime functional-programming java-stream


【解决方案1】:

您可以直接从流中返回结果

private boolean isTrainingDateNotCollidingWithTrainerSchedule(List<Training> trainerTrainings,TrainingDate potentialTrainingDate) {

     return trainerTrainings.stream().noneMatch(trainingDate -> trainingDate.startDate.isAfter(potentialTrainingDate.endDate) &&
            trainingDate.endDate.isBefore(potentialTrainingDate.startDate));
}

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2019-11-21
    • 2021-06-04
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多