Optional.ofNullable和方法链接

我对Optional.ofNullable方法感到惊讶。 有一天我写了一个应该返回Optional的函数:

 private Optional extractFirstValueFrom(InsightsResponse insight) { return Optional.ofNullable(insight.getValues().get(0).getValue()); } 

我错误地认为Optional.ofNullable会阻止参数表达式中的任何NullPointerExceptions

现在我想我知道这是非常愚蠢的想法。 Java必须首先解析参数以将其传递给Optional.ofNullable调用。

但我有一个问题。 有没有一个很好的方法来实现我的目标? 我想从表达insight.getValues().get(0).getValue()一些整数值或null。 Null可以是表达式中的每一个: insight.getValues()insight.getValues().get(0)

我知道我可以把它放在try / catch块中,但我想知道是否有更优雅的解决方案。

如果您不知道什么可以为null ,或者想要检查null所有内容,唯一的方法是将调用链接到Optional.map

如果存在值,则将提供的映射函数应用于该值,如果结果为非null,则返回描述结果的Optional。 否则返回一个空的Optional。

因此,如果映射器返回null ,将返回一个空的Optional ,这允许链接调用。

 Optional.ofNullable(insight) .map(i -> i.getValues()) .map(values -> values.get(0)) .map(v -> v.getValue()) .orElse(0); 

orElse(0)的最终调用允许在任何mapper返回null返回默认值0。

像这样的smth应该工作

 Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

好吧,根据给出的示例代码,因为#extractFirstValueFrom既不包含@Nullable也不像Guava的checkNotNull()那样检查null,让我们假设insight总是something 。 因此将Optional.ofNullable(insight.getValues())包装到Option不会导致NPE 。 然后组成调用链转换(每个结果都带有Optional ),导致结果Optional可能是SomeNone