这个怎么运作 - Java 8的Optional.of和Optional.ofNullable

3
我有一个与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条件,即传入的对象为空,那么它会正常工作,但如果它不是空的,它如何进行类型转换?

2
Optional.orElse() 看作是 Optional.getOrElse()(在我看来应该这样),同时,把 Optional.get() 看作是 Optional.getOrThrow() - walen
但如果它不是空的,它如何进行类型转换?实际上这个问题似乎很奇怪,因为所有现有的答案都详细说明了ofNullableorElse的用法,但并没有涉及到类型转换!更简单的答案是:如果它不是空的,它将使用您指定的类型new Integer,如果它是空的(我不知道怎么会是空的),它将以与Integer i = 10;相同的方式工作。 - Naman
4个回答

7

请看该方法的声明:

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);

确切的答案! :) - Mohamed Anees A
3
除此之外,您不应编写 new Integer(10)。您可以简单地编写 10,让自动装箱完成其工作,但当您确实需要明确执行时,请使用 Integer.valueOf(10)。从Java 9开始,new Integer(10) 中使用的构造函数被标记为已弃用 - Holger
确实是个好发现。 - Ravindra Ranwala
1
@Holger 我真的感觉不到new Integer(<value>)可能为空,那么在当前情况下直接使用Optional.of(Integer.valueOf(10)).get()是否有意义呢?我也没有看到编译器对isPresent的检查抱怨。 - Naman
2
@nullpointer 这些示例对我来说看起来很假,但是确实,获得 Optional<Integer> 的直接方法是 Optional.of(10)。要获得 Integer,只需使用 10 - Holger
显示剩余2条评论

1

正确的做法应该是

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

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。因此没有错误。


是的,我知道我们可以使用Optional<Integer> number = Optional.ofNullable(new Integer(10));解决它。我的问题是关于第二种情况,为什么它不会抛出错误? - StackUser2204

0
我理解 .orElse 方法的返回类型是 T,如果进入 orElse 条件,即传入的对象为空,则可以正常工作,但如果不为空,它如何进行类型转换?
Optional.ofNullable() 将返回 Optional 对象,该对象将保存我们作为参数传递到实例变量 value 中的实际值。
orElse(T other) - 如果存在值,则返回该值,否则返回作为参数传递的对象。Java 8 Optional 类中 orElse() 方法的内部实现。
public T orElse(T other) {
   return value != null ? value : other;
}

orElse接受一个泛型参数,类型转换是隐式进行的。如果值不为空,则orElse将返回该值,否则返回作为参数传递的其他值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接