这是如何工作的-Java 8 Optional.of和Optional.ofNullable
我对Java8选项有疑问 下面的代码给出了编译错误:这是如何工作的-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)的对象,这表示它是内部
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;
}