我想创建方法,它将使用可选功能并返回值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
,并且在 asset
或 asset.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/