OptionalInt 与 Optional<Integer>

2022-08-31 19:38:30

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

  1. 为什么他们没有一个共同的接口,类,是子类型,或者一些东西来揭示他们之间的关系?(当你看到它们的用途时,它们是非常相似的类。
  2. 另外,为什么需要一个额外的类?为什么不能直接使用?我以为这是由于原始的事实,但没有这样,这将是一个不一致的设计选择。OptionalIntOptional<Integer>intOptionalChar

答案 1

Java 8引入了大量专用于原语的内容。原因很可能是拳击原语可以产生大量的废“盒子”。

例如,这个

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

在这里,as结果将不一致。像这样的方法也允许留在世界。 会迫使你转换(如果你愿意,你可以很容易地做到这一点)Optional<Integer>ifPresent(IntConsumer consumer)IntStreamOptional<Integer>

不需要对 或 进行特殊支持,因为所有这些都可以表示为 。缺少的是,但是由于只有2个值,因此在流中使用它们所能做的并不多。charshortbyteintboolean


答案 2

Java 8 的流需要有一个类才能保持一致。如果您看一下 Stream,就会发现许多 方法返回 .但是,处理 一个 或任何其他基元流是令人筋疲力尽的,因此有一个 IntStream 类和一个 LongStream 类将对象替换为其未装箱的值。例如,查找 的元素之和并非易事,而对于 a,您只需调用 IntStream#sumOptionalIntOptional<T>Stream<Integer>Stream<Long>Stream<Integer>IntStream

在这些类中,JDK 有用地替换为 、 等。Optional<T>OptionalIntOptionalLong


推荐