这是如何工作的 - Java 8 Optional.of和Optional.ofNullable

use*_*861 3 java optional java-8

我对Java 8 Optionals有疑问.

以下代码给出了编译错误:

Integer number = Optional.ofNullable(new Integer(10)); 
Run Code Online (Sandbox Code Playgroud)

但是,当我们做以下它,我不明白这是怎么工作:

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 
Run Code Online (Sandbox Code Playgroud)

如果我们查看文档Optional.ofNullable(),它会返回一个类型的对象static <T> Optional<T> ofNullable(T value),表示它是内部类型转换,但文档说它的返回类型是Optional.

我得到的.orElse方法返回类型T,如果它进入orElse条件,它将工作正常,即如果传入的对象是null,但如果它不是null它是如何对它进行类型转换?

Rav*_*ala 8

看一下方法的声明,

public static <T> Optional<T> ofNullable(T value)
Run Code Online (Sandbox Code Playgroud)

所以这需要T并返回Optional<T>所以在你的情况下它需要Integer并返回一个Optional<Integer>

所以当你这样做的时候

Optional.ofNullable(new Integer(10)).orElse(10);
Run Code Online (Sandbox Code Playgroud)

orElse调用将解包该可选项并返回其中的值(如果它不为空).否则它只返回给定的值.

更新

根据以下注释,您可以在将作业留给Autoboxing的同时进一步简化它.

Optional.ofNullable(10).orElse(10);
Run Code Online (Sandbox Code Playgroud)

  • 除此之外,你永远不应该写`new Integer(10)`.您可以简单地编写"10"以让自动装箱完成其工作,但是当您确实需要明确地执行此操作时,请使用`Integer.valueOf(10)`.从Java 9开始,`new Integer(10)`中使用的构造函数被标记为*deprecated*. (3认同)
  • @nullpointer无论如何这些例子对我来说都是假的,但是,是的,要获得一个`Optional <Integer>`,直截了当的方式是`Optional.of(10)`.要获得`Integer`,只需使用`10`. (2认同)