我有一个方法findUrl()
,它以User
和Permission
为参数,查询数据库并实现一些逻辑,以查找此User
中可访问的网址逗号分隔的字符串。
我想开发一个这个方法的null安全版本
User
和Permission
作为参数,然后返回Optional
如果传递给它的至少一个值为空或findUrl
方法返回null
,则为空。我编写了下面的代码,但它似乎是一个基于null检查的实现,我没有看到使用Optional使代码更简洁的好处。
public Optional<String> nullSafeFindUrl(User user, Permissions permissions) {
if ((Optional.ofNullable(user)).isPresent() && (Optional.ofNullable(permissions)).isPresent()) {
return Optional.ofNullable(findUrl(user.get(), permissions.get()));
} else {
return Optional.empty();
}
}
有没有更好的方法来使代码更具可读性?
答案 0 :(得分:2)
您需要的是一次性平面地图和地图。
return user.flatMap(u -> permissions.map(perm -> findUrl(u, perm));
如果两者都有效,则返回空的Optional或带返回值的可选
答案 1 :(得分:2)
答案类似于Ash,但我也会添加一些解释,以便它可以帮助其他人
在第一个可选项上调用 flatMap ,所以如果这是空的,则为lambda 传递给它的表达式根本不会执行,这个调用只会返回 一个空的可选。
相反,如果用户在场,则将其用作a的输入 函数返回flatMap方法所需的Optional。 此函数的主体在第二个可选项上调用映射,因此如果它不包含 任何权限,函数将返回一个空的可选,所以整个null- 安全的方法。
最后,如果用户和权限都是 目前,作为参数传递给map方法的lambda表达式可以安全地进行 用它们调用原始的findUrl方法。
因此在应用上述方法后,实现方法减少到单行
public Optional<String> nullSafeFindUrl(User user, Permissions permissions) {
(Optional.ofNullable(user)).flatMap(u -> (Optional.ofNullable(permissions)).map(p -> findUrl(p, u)));
}