当前位置: 首页 > 知识库问答 >
问题:

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

凤明朗
2023-03-14

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

我想开发此方法的空安全版本,使用相同的用户权限作为参数,然后返回一个可选,如果传递给它的值中至少有一个为空或findUrl方法返回,则该值将为空。我写了下面的代码,但它看起来像是一个基于空检查的实现,我看不到使用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个答案

南门志
2023-03-14

答案类似于Ash,但我也会添加一些解释,以便它可以帮助其他人

在第一个可选项上调用flatMap,因此如果该选项为空,则传递给它的lambda表达式将根本不会执行,并且该调用将只返回一个空的可选项。

相反,如果用户在场,它会将其用作返回flatMap方法所需的可选值的函数的输入。这个函数的主体调用第二个可选的映射,因此如果它不包含任何权限,函数将返回一个空可选的,整个空安全方法也将返回。

最后,如果用户和权限都存在,则作为参数传递给map方法的lambda表达式可以安全地使用它们调用原始findUrl方法。

因此,应用上述方法后,实现方法简化为单行

public Optional<String> nullSafeFindUrl(User user, Permissions permissions) {
    (Optional.ofNullable(user)).flatMap(u -> (Optional.ofNullable(permissions)).map(p -> findUrl(p, u)));

}
呼延英奕
2023-03-14

你需要的是平面图和地图一气呵成。

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

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

 类似资料:
  • 番石榴的模式很棒,因为它有助于用null消除歧义。当链的第一部分可能不存在时,转换方法非常有助于创建空安全方法链,但当链的其他部分不存在时则不有用。 这个问题与Guava可选类型有关,当转换返回另一个可选时,它会问本质上相同的问题,但对于不同的用例,我认为这可能不是的预期用途(处理错误)。 考虑一个方法<代码>可选 在中间方法可能返回/的常见情况下,似乎没有一种优雅的方法来链接调用。例如,假设有一

  • 问题内容: 我正在创建要执行的JEXL脚本的沙箱,以使恶意用户无法访问我们为其提供访问权限的变量之外的数据,也无法在服务器上执行DOS攻击。我想为其他这样做的人提供文档,也让其他人对此方法有所投入。 以下是我知道需要解决的问题的列表: 仅允许使用白名单上的“ new”实例化类。 不允许访问任何类的getClass方法,因为这样便可以调用forName并且可以访问任何类。 限制对文件等资源的访问。

  • 问题内容: 我想在Mac上更新Python框架并删除旧版本,但不确定是否可以 有什么建议吗? 问题答案: 是的,很安全。 Mac的系统python位于中。 从python.org下载并安装的.dmg位于。 不要删除/ System的,但是/ Library是用户安装的,因此应该可以安全删除。

  • 在正方形应该移动的地方初始化。KeyListener继承自GameAssistant(JFrame是用KeyListener创建的) }

  • 问题内容: 我想像这样的代码来获取有关Java7功能的详细信息 可以做这样的事情 但坦白说对我来说还不太清楚。请解释一下? 问题答案: Null-safe方法调用是针对Java 7提出的,作为Project Coin的一部分,但并未最终发布。 在此处查看所有建议的功能以及所有最终选择的功能-https: //wikis.oracle.com/display/ProjectCoin/2009Prop