Java 使用可选映射和过滤器重写if语句

Java 使用可选映射和过滤器重写if语句,java,validation,lambda,optional,predicate,Java,Validation,Lambda,Optional,Predicate,我有一个接受Optional的谓词,我想检查它是否存在,以及LocalDateTime是否在当前日期之前 我可以用if语句来写它,如下所示: @Override public boolean test(Optional<ResetPassword> resetPassword) { if (resetPassword.isPresent()) { if (!resetPassword.get().getValidUntil().isBefore(LocalDa

我有一个接受
Optional
的谓词,我想检查它是否存在,以及
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;
}
resetPasswordOptional
    .ifPresent(rp -> test(rp));
@覆盖
公共布尔测试(可选重置密码){
if(resetPassword.isPresent()){
如果(!resetPassword.get().getValidUntil().isBefore(LocalDateTime.now())){
抛出新的CustomException(“不正确的日期”);
}
返回true;
}
返回false;
}

如何使用
Optional.map
Optional.filter
函数重写此代码?

决不能将
Optional
用作任何内容的参数。相反,您应该让函数接受一个
ResetPassword
,并且只有当
可选的值存在时才调用它。
像这样:

public void test(ResetPassword resetPassword) {
    if (!resetPassword.getValidUntil().isBefore(LocalDateTime.now())) {
        throw new CustomException("Incorrect date");
    }
}
然后这样称呼它:

@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;
}
resetPasswordOptional
    .ifPresent(rp -> test(rp));

我希望这一条能帮助你,另外,注意你抛出的异常,如果它是
RuntimeException
,你的应用程序在出现错误情况时会崩溃

 public boolean test(Optional<ResetPassword> resetPassword) {
        return resetPassword.isPresent() && resetPassword
                .map(ResetPassword::getValidUntil)
                .filter(localDateTime -> localDateTime.isBefore(LocalDateTime.now()))
                .orElseThrow(() -> new CustomException("Incorrect date")) != null;
    }
公共布尔测试(可选重置密码){
返回resetPassword.isPresent()和resetPassword(&R)
.map(重置密码::getValidUntil)
.filter(localDateTime->localDateTime.isBefore(localDateTime.now())
.orelsetrow(()->new CustomException(“不正确的日期”)!=null;
}

@KarelG
Optional
也有
map
filter
方法。您不应该将
Optional
用作任何内容的参数。它只能作为返回类型使用。@marstran“您不应该将可选项用作任何内容的参数。”作为非限定断言语句,这完全是错误的。这是风格的问题。有一个可选的参数类型可以让读者清楚地知道该参数可能为null,这使得代码更易于使用。@LiolikasBolikas:map
和filter似乎不是解决问题的好方法。我认为你的解决方案是尽可能好的。我认为这很难的原因是,您想要的结果组合不能很好地转换为
可选的逻辑。在您的情况下,您希望使用
布尔值
重置密码
和异常,但这并不真正符合模型。我想……我也反对使用
可选
作为方法参数。但是,如果打算将其用作
谓词
,那么在这种情况下可能需要使用它。这将允许您获取一个
可选
流,并使用该谓词对其进行过滤。虽然这种特殊情况在语义上似乎有点奇怪,但它可能在其他情况下有用。更令人担忧的是,该方法在某些情况下会引发异常,这使得它完全不适合用作
谓词
“您不应该将可选项用作任何内容的参数”。作为非限定断言语句,这完全是错误的。这是风格的问题。将一个可选的作为参数类型可以让读者清楚地知道它可能为null。@Lii它肯定不是一个非限定语句。这是一个源于布莱恩·戈茨本人的声明。看,这应该行得通!我认为海报上已经有了更清晰的内容,但这是更短的,至少它使用了
map
filter
!(如果这是你的目标…)