可选的,容易上当和方法链接

2022-08-31 22:24:15

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

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

我错误地认为这会阻止任何内部的参数表达。Optional.ofNullableNullPointerExceptions

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

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

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


答案 1

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

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

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

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

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


答案 2

像这样的smth应该工作

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

好吧,根据给出的示例代码,因为既不包含也不像Guava那样检查null,让我们假设总是。因此,换行不会产生 .然后组成转换的调用链(每个结果都有),导致的结果可能是 或 。#extractFirstValueFrom@NullablecheckNotNull()insightsomethingOptional.ofNullable(insight.getValues())OptionNPEOptionalOptional<Integer>SomeNone


推荐