如何使用Java 8创建Java方法的空安全版本可选

时间:2017-02-23 14:05:05

标签: java java-8 optional

我有一个方法findUrl(),它以UserPermission为参数,查询数据库并实现一些逻辑,以查找此User中可访问的网址逗号分隔的字符串。

我想开发一个这个方法的null安全版本 UserPermission作为参数,然后返回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();
    }
}

有没有更好的方法来使代码更具可读性?

2 个答案:

答案 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)));

}