OptionalInt vs Optional <integer>

时间:2015-10-17 19:36:26

标签: java generics java-8 language-design

在浏览java.util软件包的文档时,我惊讶地发现Optional<T>OptionalInt彼此没有任何关系。这似乎很难相信,因为它表明它们是不相关的类。

  1. 为什么他们没有共同的界面,类,子类型或某些东西来揭示他们的关系? (当你查看它们的用途时,它们非常类似的类。)
  2. 另外,为什么还需要额外的OptionalInt课程?你为什么不能只使用Optional<Integer>?我认为这是因为int是原始的,但没有OptionalChar因此这将是一个不一致的设计选择。

3 个答案:

答案 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>会迫使你转换(如果你愿意,你可以轻松做到)

不需要charshortbyte的特殊支持,因为所有这些都可以表示为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>替换为OptionalIntOptionalLong,等等。

答案 2 :(得分:3)

OptionalInt是一个容纳原始类型int的容器。原始类型不能用作泛型类的类型参数,因此它不可能是Optional<T>的子类。