java - 为什么使用Optional而不是Objects.isNull或obj == null会给我带来优势?

标签 java option-type getter

我想创建方法,它将使用可选功能并返回值NodeId
我应该从 Asset 对象中提取该值。
在某些情况下,我已经使用了一些功能,例如 ifPresent、filter、flatMap。但现在我想清楚地了解是否可以将 Optional 与简单的方法一起使用,如下例所示,我只需要从另一个对象中提取值

第一个示例据说不太好,但我尝试使用可选:

   public Optional<NodeId> findParentNodeIdByAsset(Asset asset) {
        Optional<Asset> tmpAsset = Optional.ofNullable(asset);
        if(tmpAsset.isEmpty()) {
            throw new NullPointerException();
        }
        return Optional.ofNullable(tmpAsset.get().getParents().iterator().next());
    }


在第二个示例中,我尝试编写相同的内容,但没有可选:

    public NodeId tmpFindParentNodeIdByAsset(Asset asset) {
        if(Objects.isNull(asset)) {
            throw new NullPointerException();
        }
        return asset.getParents().iterator().next();
    }

最佳答案

如果要抛出 NullPointerException,则没有必要检查 null asset 或空 tmpAsset在这些情况下。

只需写:

public NodeId tmpFindParentNodeIdByAsset(Asset asset) {
    return asset.getParents().iterator().next();
}

如果您尝试取消对 null 引用的引用,将会抛出 NullPointerException

现在,如果您不想抛出 NullPointerException 或者如果 asset 不是唯一可能发生异常的引用,那么使用 Optional 会变得很有用。为null

例如,假设 asset.getParents() 也可以为 null,并且在 assetasset.getParents() 的情况下。 getParents() 为 null,您想要返回一些默认值,或者一个空的Optional

您可以链接多个 map() 调用,将每个可能的 null 引用转换为下一个可能的 null 引用,并以可选(如下例所示)、默认值或异常。

public Optional<NodeId> findParentNodeIdByAsset(Asset asset) {
    return Optional.ofNullable(asset)
                   .map(asset -> asset.getParents())
                   .map(parents -> parents.iterator().next());
}

此外,在尝试获取其 Iterator 的第一个元素之前检查 parents 是否不为空可能会更安全。

关于java - 为什么使用Optional而不是Objects.isNull或obj == null会给我带来优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394610/

相关文章:

node.js - Sequelize getter 方法中的异步表查询

string - 为什么 NSError 的 localizedDescription 说可选 ("description")?

java - 使用 Java 从 Chaining 方法中的 Setter 和 Getter 方法检索特定值

java - 入站 JCA 适配器的 MDB 监听器未在 WildFly 中启动

Java:jlist中的文件列表仅显示文件名+扩展名

c++ - 传递 std::ref(value) 时是否应应用 std::optional 的推导指南?

字符串内带有可选单词的正则表达式

Javascript setter 和 getter 返回不同的输出

java - 字符和字节缓冲区编码和解码

java - 有没有办法使用 selenium 和 java 从控制台设置启用保留日志来午餐 ChromeDriver?