我很惊讶 Optional.ofNullable
方法。有一天,我写了一个函数,应该返回一个Optional。
private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) {
return Optional.ofNullable(insight.getValues().get(0).getValue());
}
我误以为 Optional.ofNullable
将防止任何 NullPointerExceptions
内的参数表达。
现在我想我知道这是一个非常愚蠢的想法。Java必须先解析参数,才能将其传递给 Optional.ofNullable
调用。
但我有一个问题。有没有一个很好的方法来实现我的目标?我想从表达式中获得 insight.getValues().get(0).getValue()
某个Integer值或null。null可以是每一个表达式。insight.getValues()
或 insight.getValues().get(0)
.
我知道,我可以只是把这个在trycatch块,但我想知道是否有更优雅的解决方案。
如果你不知道什么可以 null
或想检查一切 null
,唯一的方法是连锁调用 Optional.map
:
如果存在一个值,则对其应用提供的映射函数,如果结果是非空的,则返回一个描述结果的Option。否则返回一个空的Optional。
因此,如果映射函数返回 null
,一个空的 Optional
将被返回,这允许连锁调用。
Optional.ofNullable(insight)
.map(i -> i.getValues())
.map(values -> values.get(0))
.map(v -> v.getValue())
.orElse(0);
最后调用 orElse(0)
允许在有映射器返回时返回默认值0。null
.
这样的东西应该可以用
Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue())
好吧,根据给定的示例代码,作为 #extractFirstValueFrom
既不包含 @Nullable
也不像Guava的 checkNotNull()
,让我们假设 insight
总是 something
从而包 Optional.ofNullable(insight.getValues())
变成 Option
不会导致 NPE
......然后调用链式变换组成(每个结果都与 Optional
),从而导致 Optional<Integer>
那可能是 Some
或 None
.
public Optional<Integer> extractFirstValueFrom(InsightsResponse insight) {
AtomicReference<Optional<Integer>> result = new AtomicReference<>(Optional.empty());
Optional.ofNullable(insight.getValues().get(0)).ifPresent(ele -> result.set(Optional.ofNullable(ele.getValue())));
return result.get();
}
我觉得有些东西你可以用 ifPresent
Api作为一个null-safe操作。java.util.Optional#map
用过的 ifPresent
Api也是如此。