OptionalInt 与 Optional<Integer>

OptionalInt vs Optional<Integer>

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

  1. 为什么它们没有共同的接口,class,是子类型,或者某种东西来揭示它们之间的关系? (当您查看它们的用途时,它们 非常 相似 class。)
  2. 此外,为什么需要额外的 OptionalInt class?为什么不能只使用 Optional<Integer>?我认为这是因为 int 是原始的,但没有 OptionalChar 所以这将是一个不一致的设计选择。

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

的子类

Java 8 的流需要有一个 OptionalInt class 才能保持一致。如果你看一下 Stream class, you'll see that many of the methods return Optional<T>. However, dealing with a Stream<Integer>, Stream<Long> or any other streams of primitives is exhausting, so there is an IntStream class and a LongStream class which replace the object with its unboxed value. For instance, finding the sum of the elements of a Stream<Integer> is not trivial, whereas for an IntStream, you just call IntStream#sum

在这些 class 中,JDK 将 Optional<T> 替换为 OptionalIntOptionalLong 等。

Java 8 介绍了很多专门用于原语的内容。原因很可能是装箱基元会造成大量浪费 "boxes"。

比如这个

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

这里,Optional<Integer> 结果是不一致的。 ifPresent(IntConsumer consumer) 这样的方法也允许留在 IntStream 世界中。 Optional<Integer> 会强制您转换(如果您愿意,可以轻松完成)

不需要特别支持charshortbyte,因为它们都可以表示为int。缺少的是 boolean,但由于只有 2 个值,您在流中无法使用它们做很多事情。