java - 为什么使用 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();
}
解决方案
如果您要在这些情况下抛出,则没有必要检查null
asset
或清空。tmpAsset
NullPointerException
写吧:
public NodeId tmpFindParentNodeIdByAsset(Asset asset) {
return asset.getParents().iterator().next();
}
如果您尝试取消引用空引用,NullPointerException
则会抛出 。
现在,Optional
如果您不想 throwNullPointerException
或者 ifasset
不是唯一可能是null
.
例如,假设它asset.getParents()
也可以是null
,并且如果其中一个asset
orasset.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
。