【发布时间】: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()返回boolean、false暗示 某事 出错了,你猜怎么着。好吧,今天有新的java.nio.file.Files.delete(Path)通过不同的异常类型发出不同的错误情况。就像思想的食物......
标签: java lambda java-8 optional