在浏览java.util软件包的文档时,我惊讶地发现Optional<T>
和OptionalInt
彼此没有任何关系。这似乎很难相信,因为它表明它们是不相关的类。
OptionalInt
课程?你为什么不能只使用Optional<Integer>
?我认为这是因为int
是原始的,但没有OptionalChar
因此这将是一个不一致的设计选择。答案 0 :(得分:27)
Java 8引入了大量专用于原语的内容。原因很可能是拳击原语会造成很多浪费&#34; box&#34;。
例如这个
OptionalInt optionalFirst = IntStream
.range(0, 100)
.filter(i -> i % 23 > 7)
.findFirst();
此处,Optional<Integer>
结果不一致。此外,ifPresent(IntConsumer consumer)
等方法也可以保持IntStream
世界。 Optional<Integer>
会迫使你转换(如果你愿意,你可以轻松做到)
不需要char
或short
或byte
的特殊支持,因为所有这些都可以表示为int
。缺少的是boolean
,但由于只有2个值,因此在流中没有太多可以做的事情。
答案 1 :(得分:10)
需要有一个OptionalInt
类来使Java 8的流保持一致。如果您查看Stream
class,则会看到many of the methods返回Optional<T>
。但是,处理Stream<Integer>
,Stream<Long>
或任何其他基元流是令人筋疲力尽的,因此有一个IntStream
类和一个LongStream
类用它取消装箱替换该对象值。例如,找到Stream<Integer>
的元素总和并非易事,而对于IntStream
,您只需调用IntStream#sum
在这些类中,JDK有助于将Optional<T>
替换为OptionalInt
,OptionalLong
,等等。
答案 2 :(得分:3)
OptionalInt
是一个容纳原始类型int
的容器。原始类型不能用作泛型类的类型参数,因此它不可能是Optional<T>
的子类。