有没有充分的理由说明没有:
OptionalInt.ofNullable(Integer);
如果您想将可选/可空的Integer转换为OptionalInt,这似乎是一个完美的选择。我目前正在使用我写的这个util方法:
public static OptionalInt optionalIntOfNullable(Integer integer){
return integer == null ? OptionalInt.empty() : OptionalInt.of(integer);
}
但是,我不知道我是否错过了什么。
答案 0 :(得分:13)
OptionalInt
优于Optional<Integer>
的优点是,如果源是原始int
值,则可以避免装箱操作。
如果源已经是Integer
,则不适用。在这种情况下,如果您的下一个操作需要int
,则在您构造OptionalInt
或使用以下操作链接下一个操作时,始终将发生取消装箱操作Optional<Integer>
。因此,使用OptionalInt
没有任何优势。
请记住,这些类并不打算用作参数类型,因此不应该有任何代码需要OptionalInt
作为输入。引用a recent statement from Brian Goetz:
我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且使用
null
这样的绝对可能性很大导致错误。
(我强调)
顺便说一句,您可以使用Optional<Integer>
的常规操作,在没有条件运算符的情况下将OptionalInt
转换为Optional
:
Integer boxed=null;
OptionalInt optInt=Optional.ofNullable(boxed)
.map(OptionalInt::of).orElseGet(OptionalInt::empty);
从Java 9开始,您也可以使用
OptionalInt optInt=Stream.ofNullable(boxed).mapToInt(Integer::intValue).findAny();
但是,如上所述,它通常不需要,因为通常只需指定后续操作即可消耗int
或Integer
(如果存在)。这适用于Optional
和OptionalInt
。
答案 1 :(得分:0)
OptionalInt
包含int
,而不是Integer
值,因此内容可以存在与否,但永远不会是null
。这有点像哲学问题。正如Sotirios Delimanolis指出的那样,如果你真的需要它,只需诉诸Optional<Integer>
。