Optional.ofNullable和方法链。

问题描述 投票:31回答:3

我很惊讶 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块,但我想知道是否有更优雅的解决方案。

java java-8 optional
3个回答
60
投票

如果你不知道什么可以 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.


2
投票

这样的东西应该可以用

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> 那可能是 SomeNone.


0
投票
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也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.