OptionalInt 与 Optional<Integer>
OptionalInt vs Optional<Integer>
在浏览 java.util 包的文档时,我惊讶地发现 Optional<T>
和 OptionalInt
彼此没有关系。这似乎很难相信,因为这表明它们是不相关的 classes.
- 为什么它们没有共同的接口,class,是子类型,或者某种东西来揭示它们之间的关系? (当您查看它们的用途时,它们 非常 相似 class。)
- 此外,为什么需要额外的
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>
替换为 OptionalInt
、OptionalLong
等。
Java 8 介绍了很多专门用于原语的内容。原因很可能是装箱基元会造成大量浪费 "boxes"。
比如这个
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 个值,您在流中无法使用它们做很多事情。
在浏览 java.util 包的文档时,我惊讶地发现 Optional<T>
和 OptionalInt
彼此没有关系。这似乎很难相信,因为这表明它们是不相关的 classes.
- 为什么它们没有共同的接口,class,是子类型,或者某种东西来揭示它们之间的关系? (当您查看它们的用途时,它们 非常 相似 class。)
- 此外,为什么需要额外的
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>
替换为 OptionalInt
、OptionalLong
等。
Java 8 介绍了很多专门用于原语的内容。原因很可能是装箱基元会造成大量浪费 "boxes"。
比如这个
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 个值,您在流中无法使用它们做很多事情。