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

2022-09-02 13:47:15

有没有一个很好的理由为什么没有:

OptionalInt.ofNullable(Integer);

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

 public static OptionalInt optionalIntOfNullable(Integer integer){
     return integer == null ? OptionalInt.empty() : OptionalInt.of(integer);
 }

然而,还有什么不好的,我想知道我是否错过了什么。


答案 1

over 的优点是,如果源是基元值,则可以避免装箱操作。OptionalIntOptional<Integer>int

如果源已经是 .在这种情况下,如果下一个操作需要 ,则始终会发生取消装箱操作,无论是在构造时还是在将下一个操作与 .因此,使用a没有任何优势。IntegerintOptionalIntOptional<Integer>OptionalInt

请记住,这些类的目的不是用作参数类型,因此不应有代码期望 as 输入。引用Brian Goetz最近的一句话OptionalInt

我们的目的是为库方法返回类型提供一种有限的机制,其中需要有一种清晰的方式来表示“无结果”,并且用于此类方法极有可能导致错误。null

(由我强调)

顺便说一句,您可以使用以下通常的操作将 a 转换为不带条件运算符的 :Optional<Integer>OptionalIntOptional

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

但是,如前所述,这不应该是必要的,因为通常您只需指定后续操作,该操作将消耗或,如果存在。这适用于和 .intIntegerOptionalOptionalInt


答案 2

OptionalInt包装一个 ,而不是一个值,因此内容可以存在,也可以不存在,但永远不能存在。这有点像哲学问题。正如Sotirios Delimanolis所指出的那样,如果您真的需要它,只需诉诸.intIntegernullOptional<Integer>


推荐