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