Optional.ofNullable和方法链接 - java

我对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)

我知道我可以将其放在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),则对 null 的最终调用允许返回默认值0。

两种可选方案的绝佳解决方案,如果存在一个,则另一个不能为空 - java

我正在寻找此代码的更优雅的解决方案:var first = Optional.ofNullable(a); var second = Optional.ofNullable(b); if ((unit.isPresent() && value.isEmpty()) || (value.isPresent() && unit.i…

基于String是否为空创建Guava Optional的简便方法 - java

我正在使用番石榴的Optional,并且我想在字符串为空时返回Optional.absent()或在字符串不为空时返回Optional.of(name)。是否可以不使用三元运算符而以某种简洁的形式进行操作?这是我当前的代码:final String name = getName(); final Optional<String> optional…

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…