OptionalInt vs Optional <Integer>

Mic*_*ael 37 java generics language-design java-8

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

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

zap*_*apl 31

Java 8引入了很多专用于原语的东西.原因很可能是拳击原语可以创造大量浪费的"盒子".

例如这个

OptionalInt optionalFirst = IntStream
    .range(0, 100)
    .filter(i -> i % 23 > 7)
    .findFirst();
Run Code Online (Sandbox Code Playgroud)

在这里,Optional<Integer>结果将是不一致的.同样的方法也ifPresent(IntConsumer consumer)可以让IntStream世界保持这种状态.Optional<Integer>会迫使你转换(如果你愿意,你可以轻松做到)

有没有必要为特别支持charshortbyte因为所有的人都可以表示为int.缺少的是,boolean但由于只有2个值,因此在流中没有太多可以做的事情.


Jus*_*tin 12

需要有一个OptionalIntJava 8流的类才能保持一致.如果你看一看的Stream,你会看到很多 方式返回Optional<T>.然而,处理一个Stream<Integer>,Stream<Long>或基元的任何其他流是排气,所以有一个IntStream类和LongStream类替换其未装箱值的对象.例如,找到a元素的总和Stream<Integer>并不是微不足道的,而对于a IntStream,你只需要调用IntStream#sum

在这些课程中,JDK有益替换Optional<T>OptionalInt,OptionalLong等.


Jir*_*sek 5

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

  • @Michael,因为有时您不想因自动装箱原语的开销而产生成本。从逻辑上讲,你是对的,否则它们是多余的。他们只对最常用的类型这样做,因为他们不想添加太多的类。与 `IntConsumer` 和 `DoubleConsumer` 相同,但没有 `CharConsumer`。请注意,在 Java 9 中,您应该(计划可以更改)能够对原语进行泛型化,而这一切都将是遗留的。 (2认同)