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

Tim*_*the 11 java optional java-8

有没有一个很好的理由没有:

OptionalInt.ofNullable(Integer);
Run Code Online (Sandbox Code Playgroud)

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

 public static OptionalInt optionalIntOfNullable(Integer integer){
     return integer == null ? OptionalInt.empty() : OptionalInt.of(integer);
 }
Run Code Online (Sandbox Code Playgroud)

那不是那么糟糕,但是,我想知道我是否错过了什么.

Hol*_*ger 14

的优势OptionalIntOptional<Integer>是你能避免装箱操作如果源是一种原始的int价值.

如果源已经是,则不适用Integer.在这种情况下,如果您的下一个操作需要a int,则在您构造或使用a链接下一个操作时,将始终发生取消装箱操作.所以使用提供没有优势.OptionalIntOptional<Integer>OptionalInt

请记住,这些类不打算用作参数类型,因此不应该有任何代码需要OptionalInt输入.引用Brian Goetz最近的声明:

我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示"无结果",并且使用null这种方法绝对可能导致错误.

(我强调)

顺便说一句,您可以使用以下常规操作将a转换Optional<Integer>OptionalInt没有条件运算符的Optional:

Integer boxed=null;
OptionalInt optInt=Optional.ofNullable(boxed)
    .map(OptionalInt::of).orElseGet(OptionalInt::empty);
Run Code Online (Sandbox Code Playgroud)

从Java 9开始,您也可以使用

OptionalInt optInt=Stream.ofNullable(boxed).mapToInt(Integer::intValue).findAny();
Run Code Online (Sandbox Code Playgroud)

但是,如上所述,它通常不需要像通常那样只指定后续操作,否则将消耗int或者Integer,如果存在的话.这适用于OptionalOptionalInt.

  • 有一种更简便的方法:创建两个重载方法,一个重载方法,一个带参数,另一个不带参数。自从将近20年以来,这已成为Java的既定模式。这些方法可以使用内部包含通用代码的其他方法。例如,具有Arrays.sort(Object [])和Arrays.sort(T [],Comparator &lt;?super T&gt;)比Arrays.sort(T [],Optional &lt;Comparator &lt;?super T&gt; &gt;)`,特别是对于那些首先没有使用“ Optional”的呼叫者。使用“可选”作为参数类型并不完全错误,但这不是预期的用例,因此不会驱动设计决策。 (2认同)
  • @David Phillips:当您有许多参数时,可能是时候重新考虑该策略了,特别是如果其中许多参数是可选的。我会求助于参数对象,构建器模式等。 (2认同)
  • @MartínColl 在这种情况下使用 `OptionalInt` 而不是 `Optional&lt;Integer&gt;` 你​​会得到什么?如前所述,它并不能避免装箱,因为“Integer”已经装箱了。此外,“OptionalInt”缺少“Optional&lt;Integer&gt;”的几种方法(“filter”、“map”、“flatMap”),因此您限制了功能而没有任何好处。 (2认同)