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

标签 java java-8 option-type

我有一个方法findUrl(),它将UserPermission作为参数并查询数据库并实现一些逻辑来查找此用户可以访问的URL,以逗号分隔的字符串形式。

我想开发该方法的空安全版本,采用相同的方法 UserPermission 作为参数,然后返回一个 Optional ,这将是 如果传递给它的至少一个值为空,则为空,或者 findUrl 方法返回 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();
    }
}

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

最佳答案

您需要的是一次性绘制平面 map 和 map 。

return user.flatMap(u -> permissions.map(perm -> findUrl(u, perm));

这将返回一个空的可选值或一个带有返回值的可选值(如果两者都有效)

关于java - 如何使用 Java 8 可选创建 Java 方法的空安全版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42417990/

相关文章:

java - 我可以重定向工作线程以在处理过程中执行不同的工作吗?

Java Enum.valueOf() 值不存在时的效率

foreach - 如何在java8中嵌套的forEach()中设置值?

ios - 为什么在这段代码中我会得到 "Unexpected non-void return value in void function"

java - 在 jpanel 上绘制字符串

java - 在java中寻找基于角色的身份验证解决方案

docker - 在 centos 7 dockerfile 中安装 java 8

java - 使用 Java-8 AES/GCM 验证/加密部分数据 block

ios - 为什么 Objective-C API 会返回隐式解包的可选值?

Java Optional.orElseThrow 签名解释