Optional.ofNullable 和方法链

新手上路,请多包涵

我对 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() 获得一些整数值或空值。 Null 可以是以下每个表达式: insight.getValues()insight.getValues().get(0)

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

原文由 sebast26 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 599
2 个回答

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

如果存在一个值,则将提供的映射函数应用于它,如果结果为非空,则返回一个描述结果的 Optional。否则返回一个空的 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

原文由 Tunaki 发布,翻译遵循 CC BY-SA 3.0 许可协议

这样的事情应该可以

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

well, according to the sample code given, as #extractFirstValueFrom do not contain neither @Nullable nor checks for null like Guava’s checkNotNull() , let’s assume that insight 总是 something 。因此将 Optional.ofNullable(insight.getValues()) 包装成 Option 不会导致 NPE 。 then call chain of transformations is composed (each results with Optional ) that lead to result Optional<Integer> that might be either Some or None .

原文由 hahn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题