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

这是如何工作的-Java 8 Optional.of和Optional.ofNullable,java,java-8,optional,Java,Java 8,Optional,我对Java8选项有疑问 下面的代码给出了编译错误: Integer number = Optional.ofNullable(new Integer(10)); 但当我们执行以下操作时,它确实是而不是,我不明白这是如何工作的: Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 如果我们查看的文档,它返回一个类型为static Optional of nullable(T value)的对象,这表示它是内部

我对Java8选项有疑问

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

Integer number = Optional.ofNullable(new Integer(10)); 
但当我们执行以下操作时,它确实是而不是,我不明白这是如何工作的:

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 
如果我们查看的文档,它返回一个类型为
static Optional of nullable(T value)
的对象,这表示它是内部类型转换,但文档说它返回类型为
Optional

我得到
.orElse
方法返回类型是
T
,如果它进入
orElse
条件,也就是说,如果传入的对象是
null
,那么它将如何进行类型转换

Integer number = Optional.ofNullable(new Integer(10));
这样,您可以尝试将
可选设置为
整数
。这显然是不允许的

当你这样做的时候

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

使用时,您正在调用
Optional.orElse
,由于您没有使用
Optional.get
,因此将返回一个
整数。所以没有错误。

看看方法的声明

public static <T> Optional<T> ofNullable(T value)
orElse
调用将打开可选项,如果它不是空的,则返回其中的值。否则它只返回给定的值

更新

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

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

正确的方法是

Optional<Integer> numberOpt = Optional.ofNullable(new Integer(10));
Optional numberropt=Optional.ofNullable(新整数(10));
我得到了.orElse方法返回类型为T的结果,这将很好地工作 如果它转到orElse条件,即如果传入的对象是 null,但如果它不是null,它如何进行类型转换

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

orElse(T other)返回值(如果存在),否则返回作为参数传递的对象。Java8可选类中orElse()方法的内部

public T orElse(T other) {
   return value != null ? value : other;
}

orElse接受泛型参数,隐式执行类型转换。如果orElse的值不为null,则返回该值,否则返回作为参数传递的其他值

是的,我知道我们可以用
Optional number=Optional.ofNullable(新整数(10))来解决它我的问题是关于第二种情况,为什么它不抛出错误的确切答案!:)谢谢,它不会短路,我想它会直接从.ofNullableMethod返回。除此之外,你永远不应该写
新的整数(10)
。您只需编写
10
即可让自动装箱完成其工作,但如果确实需要显式执行,请使用
Integer.valueOf(10)
。从Java 9开始,
new Integer(10)
中使用的构造函数被标记为已弃用。@Holger我真的没有感觉到
new Integer()
可能为
null
,那么在当前场景中简单地使用
Optional.of(Integer.valueOf(10)).get()
没有意义吗?我也看不到编译器在那里抱怨检查
isPresent
。@nullpointer这些示例在我看来似乎是人为的,但是,要获得
可选的
,直接的方法是
可选的。of(10)
。要获取
整数
,只需使用
10
。将其视为
可选。orElse()
被称为
可选。getOrElse()
(它应该这样做,IMHO)。当您使用它时,请将
Optional.get()
想象为它被调用为
Optional.getOrThrow()
。但是如果它不是null,它如何进行类型转换呢?作为一个实际的问题,关于什么答案被接受似乎很奇怪,因为所有现有的答案都详细说明了nullable和orElse的用法,而不是关于类型转换!一个更简单的答案是,如果它不为null,它将使用您指定的类型
new Integer
,如果它为null(我不知道如何),它的工作方式与
Integer i=10相同工作。
public T orElse(T other) {
   return value != null ? value : other;
}