为什么没有OptionalInt.ofNullable(Integer);

时间:2014-10-14 15:15:19

标签: java java-8 optional

有没有充分的理由说明没有:

OptionalInt.ofNullable(Integer);

如果您想将可选/可空的Integer转换为OptionalInt,这似乎是一个完美的选择。我目前正在使用我写的这个util方法:

 public static OptionalInt optionalIntOfNullable(Integer integer){
     return integer == null ? OptionalInt.empty() : OptionalInt.of(integer);
 }
但是,我不知道我是否错过了什么。

2 个答案:

答案 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();

但是,如上所述,它通常不需要,因为通常只需指定后续操作即可消耗intInteger(如果存在)。这适用于OptionalOptionalInt

答案 1 :(得分:0)

OptionalInt包含int,而不是Integer值,因此内容可以存在与否,但永远不会是null。这有点像哲学问题。正如Sotirios Delimanolis指出的那样,如果你真的需要它,只需诉诸Optional<Integer>