如何将以下Java代码转换为Java 8?

时间:2019-07-16 08:41:40

标签: java java-8 stream guava

我这样写Java代码,

 private DateTime getChangedDoseEndDate(final DateTime actualTerminateDate, final DateTime discontinueDate)
  {
    if (actualTerminateDate == null)
    {
      return discontinueDate;
    }

    if (discontinueDate == null)
    {
      return actualTerminateDate;
    }
    else if (actualTerminateDate.isBefore(discontinueDate))
    {
      return actualTerminateDate;
    }
    else
    {
      return discontinueDate;
    }
  }

我正在尝试将Guava转换为编写单行函数。 这是我尝试过的。这是对的吗 ?我还需要将其转换为Java 8。

return Ordering.natural().nullsLast().min(discontinueDate, actualTerminateDate);

1 个答案:

答案 0 :(得分:1)

如果您想使代码更简洁,那么您还有其他方法可以这样做,除非您只想单线展示。这是解决该问题的方法之一。它不是单行的,也没有使用任何lambda,但是它仍然是有效的Java 8代码,具有相同的逻辑,但是以更简单的方式表示。

DateTime getChangedDoseEndDate(final DateTime actualTerminateDate, final DateTime discontinueDate) {
  if (actualTerminateDate != null && actualTerminateDate.isBefore(discontinueDate)) {
    return actualTerminateDate;
  }
  return discontinueDate;
}

您甚至可以使用三元运算符并将其装入单行代码(它仍然是有效的Java 8代码)。

DateTime getChangedDoseEndDate(final DateTime terminateDate, final DateTime discontinueDate) {
  return terminateDate != null && terminateDate.isBefore(discontinueDate) ? terminateDate : discontinueDate;
}

但是,如果您可以保证null安全,那么您可能会拥有类似于Guava的代码(自从您提出要求以来,它就可以很好地工作)。

DateTime getChangedDoseEndDate(@Nonnull final DateTime actualTerminateDate, @Nonnull final DateTime discontinueDate) {
  return Stream.of(actualTerminateDate, discontinueDate).min(Comparator.naturalOrder()).get();
}