【发布时间】:2018-10-31 08:41:17
【问题描述】:
我有一个接受 Optional<LocalDateTime> 的谓词,我想检查它是否存在并且 LocalDateTime 在当前日期之前。
我可以使用如下所示的 if 语句来编写它:
@Override
public boolean test(Optional<ResetPassword> resetPassword) {
if (resetPassword.isPresent()) {
if (!resetPassword.get().getValidUntil().isBefore(LocalDateTime.now())) {
throw new CustomException("Incorrect date");
}
return true;
}
return false;
}
如何使用Optional.map 和Optional.filter 函数重写它?
【问题讨论】:
-
@KarelG
Optional也有map和filter方法。 -
你不应该使用
Optional作为任何东西的参数。它只能用作返回类型。 -
@marstran “你永远不应该使用 Optional 作为任何东西的参数。” 作为一个不合格的断言声明,这是完全错误的。这是风格问题。将 optional 作为参数类型可以让读者清楚地知道该参数可能为 null,这使得代码更易于使用。
-
@LiolikasBolikas:
map和filter似乎没有解决问题的好方法。我认为您的解决方案尽可能好。我认为这很难的原因是,你想要的结果组合不能很好地转化为Optional的逻辑。在您的情况下,您想使用boolean、ResetPassword和异常,这并不适合模型。我认为... -
我也反对使用
Optional作为方法参数。但是,如果打算将其用作Predicate,则可能需要在这种情况下使用它。这将让您获取Optional<ResetPassword>流并使用此谓词过滤它们。虽然从语义上讲,这种特殊情况似乎有点奇怪,但可能还有其他有用的情况。更令人担忧的是,此方法在某些情况下会引发异常,这使得它完全不适合大多数用作Predicate的用途。
标签: java validation lambda optional predicate