【问题标题】:Java 8 Optional how to deal with too many orElsesJava 8 Optional 如何处理太多的orElses
【发布时间】:2016-11-08 10:06:41
【问题描述】:

我们来看看没有 lambdas 的例子:

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<T>):

return CredentialService.get(id)
        .filter(Credentials::isActive)
        .map(credentials -> UserService.get(credentials.getUserId())
            .map(Status::ok)
            .orElse(Status.bad())              
        ).orElse(Status.bad());

现在我必须返回 Status.bad() 两次(在实际代码中,大约 4-5)。是否可以返回一次Status.bad()

【问题讨论】:

  • 我没有更多关于这些代码行细节的信息。但也许只需要返回最后一个.orElse(Status.bad())也许你可以考虑一下。
  • @NicolasFilotto,Optional<Credentials>,所以filter 存在。 @smsnheck,你说得对,它只取决于剩余的orElse 中的Optional。它适用于.orElse(Optional.empty()).orElse(null)。这是一种让它不混乱的方法吗?
  • 无论您是否使用 optional,您的代码也可能看起来像垃圾,因为设计已关闭。 Java 8 的功能组件只是另一种编程方法,而不是神奇的仙尘。
  • @delver 这并不总是给定的。我发现在每个问题上都抛出 lambda 是非常糟糕的编程风格,而更持久、更优雅的解决方案就像在服务层添加 getActiveCredentials(id)(作为示例)。
  • @Kayaman:问题不在于使用 lambda 表达式或Optional,而在于原始代码中已经包含的逻辑。对于可能失败的可能很长的事情链,返回一个通用的Status.bad(),离开调用者,最终离开用户,没有任何关于它失败的为什么的提示。这就像臭名昭著的 java.io.File.delete() 返回 booleanfalse 暗示 某事 出错了,你猜怎么着。好吧,今天有新的java.nio.file.Files.delete(Path) 通过不同的异常类型发出不同的错误情况。就像思想的食物......

标签: java lambda java-8 optional


【解决方案1】:

我可以猜到 UserService::get return Optional 在这种情况下你最好使用 flatMap:

CredentialService.get(id)
         .filter(Credentials::isActive)
            .flatMap(credentials -> UserService.get(credentials.getUserId())
            .map(Status::ok)
            .orElse(Status.bad())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 2020-07-14
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多