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

时间:2018-11-12 07:40:04

标签: java java-8 optional

我对Java 8 Optionals有疑问。

下面的代码给出了编译错误:

Integer number = Optional.ofNullable(new Integer(10)); 

但是,当我们执行以下操作时,它会,我不知道它是如何工作的:

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 

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

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

4 个答案:

答案 0 :(得分:6)

看看方法的声明,

public static <T> Optional<T> ofNullable(T value)

因此,它花费T并返回Optional<T>,因此,在您的情况下,它花费Integer并返回Optional<Integer>

所以当您这样做时,

Optional.ofNullable(new Integer(10)).orElse(10);

orElse调用将取消包装可选内容,如果不为空,则返回其中的值。否则,它只会返回给定值。

更新

根据以下注释,您可以在将工作留给自动装箱的同时进一步简化它。

Optional.ofNullable(10).orElse(10);

答案 1 :(得分:1)

正确的方法是

Optional<Integer> numberOpt = Optional.ofNullable(new Integer(10));

答案 2 :(得分:0)

Integer number = Optional.ofNullable(new Integer(10));

使用此方法,您尝试将Optional<Integer>放在Integer上。显然是不允许的。

完成时

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 

在调用Optional<Integer>.orElse时,由于未使用Optional<Integer>.get,因此会返回Integer。所以没有错误。

答案 3 :(得分:0)

  

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

Optional.ofNullable()将返回Optional对象,该对象将把我们作为参数传递的实际值保存到名为value的实例变量中。

orElse(其他)-返回值(如果存在),否则返回作为参数传递的对象。 Java 8可选类中的orElse()方法的内部。

extension Swift.Optional where Wrapped == String {
    var isBlank: Bool {
        return self?.isBlank ?? true
    }
}

orElse采用泛型参数,并且隐式执行类型转换。如果其不为null,则orElse将返回该值,否则返回作为参数传递的另一个值。