Java 8可选如何处理太多的Orelse
让我们看一看不带lambdas的示例:Java 8可选如何处理太多的Orelse,java,lambda,java-8,optional,Java,Lambda,Java 8,Optional,让我们看一看不带lambdas的示例: Credentials credentials = CredentialService.get(id); if (credentials != null && credentials.isActive()) { User user = UserService.get(credentials.getUserId()); if (user != null) return Status.ok(user); } re
Credentials credentials = CredentialService.get(id);
if (credentials != null && credentials.isActive()) {
User user = UserService.get(credentials.getUserId());
if (user != null)
return Status.ok(user);
}
return Status.bad();
如您所见,只有当用户不是null
时,才会返回Status.ok()。否则,将返回Status.bad()
。现在使用lambdas(服务的方法现在返回Optional
):
现在我必须返回两次Status.bad()
(在实际代码中,大约4-5次)。这是一种返回Status.bad()
一次的方法吗?我可以猜UserService::get return可选在这种情况下,您最好使用flatMap:
CredentialService.get(id)
.filter(Credentials::isActive)
.flatMap(credentials -> UserService.get(credentials.getUserId())
.map(Status::ok)
.orElse(Status.bad())
我没有关于这些代码行的详细信息。但可能只需要返回最后一个.orElse(Status.bad())
也许您可以考虑一下。@NicolasFilotto,可选,因此过滤器存在@smsnheck,你说得对,它只取决于剩余的orElse
中的Optional
。它与.orElse(可选.empty()).orElse(null)
一起使用。这是一种不让人困惑的方法吗?也有可能你的代码看起来像垃圾,无论你是否使用可选的,因为设计是关闭的。Java8的功能组件只是另一种编程方法,而不是通常给出的神奇童话。我发现在每个问题上都使用lambda是一种非常糟糕的编程风格,而更持久、更优雅的解决方案是向服务层添加getActiveCredentials(id)
(例如)。@Kayaman:问题不在于lambda表达式的使用或可选的,但是原始代码中已经包含的逻辑。对于可能失败的一长串事件,将返回一个通用的Status.bad()
,将调用方和用户留在一起,而不显示失败的原因。这就像臭名昭著的java.io.File.delete()
返回一个boolean
,false
表示出了问题,猜猜看。现在,新的java.nio.file.Files.delete(Path)
通过不同的异常类型发送不同的错误条件。就像是思想的食粮…
CredentialService.get(id)
.filter(Credentials::isActive)
.flatMap(credentials -> UserService.get(credentials.getUserId())
.map(Status::ok)
.orElse(Status.bad())