首页 > 解决方案 > 为什么使用 Optional 而不是 Objects.isNull 或 obj == null 会给我带来优势?

问题描述

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

First 示例中提取值,据说这不是很好,但是我尝试使用 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());
    }


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

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

标签: javaoptionalgetter

解决方案


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

写吧:

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

如果您尝试取消引用空引用,NullPointerException则会抛出 。

现在,Optional如果您不想 throwNullPointerException或者 ifasset不是唯一可能是null.

例如,假设它asset.getParents()也可以是null,并且如果其中一个assetorasset.getParents()为空,您想要返回一些默认值,或者一个空的Optional

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

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

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


推荐阅读