Mic*_*ael 37 java generics language-design java-8
当滚动浏览java.util包的文档时,我很惊讶地发现它Optional<T>
并且OptionalInt
彼此没有任何关系.这似乎很难相信,因为它表明它们是不相关的类.
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>
会迫使你转换(如果你愿意,你可以轻松做到)
有没有必要为特别支持char
或short
或byte
因为所有的人都可以表示为int
.缺少的是,boolean
但由于只有2个值,因此在流中没有太多可以做的事情.
Jus*_*tin 12
需要有一个OptionalInt
Java 8流的类才能保持一致.如果你看一看的Stream
类,你会看到很多 的 的 方式返回Optional<T>
.然而,处理一个Stream<Integer>
,Stream<Long>
或基元的任何其他流是排气,所以有一个IntStream
类和LongStream
类替换其未装箱值的对象.例如,找到a元素的总和Stream<Integer>
并不是微不足道的,而对于a IntStream
,你只需要调用IntStream#sum
在这些课程中,JDK有益替换Optional<T>
用OptionalInt
,OptionalLong
等.
OptionalInt
是一个保存原始类型值的容器int
。原始类型不能用作泛型类的类型参数,因此它不可能是Optional<T>
.