Answers:
正如伊兰所说,这不是唯一的失踪者。
阿BooleanStream将是无用的,一个ByteStream(如果它存在)可以作为一个被处理InputStream或转换成IntStream(如罐short),并且float可以作为一个来处理DoubleStream。
由于char仍然无法表示所有字符(请参见链接),因此有点遗留。尽管大多数人无论如何都不必处理代码点,所以它看起来很奇怪。我的意思是您在使用时String.charAt()没有想到“这并非在所有情况下都有效”。
因此,有些事情被忽略了,因为它们并不那么重要。正如JB Nizet在链接的问题中所说:
设计者明确选择通过将原始流限制为3种类型来避免类和方法的爆炸式增长,因为其他类型(char,short,float)可以用它们较大的等价物(int,double)表示,而不会造成任何明显的性能损失。
原因BooleanStream将是无用的,因为您只有2个值,这极大地限制了操作。没有数学运算可做,您是否经常使用大量布尔值?
BooleanStream无用”:为什么?
reduce(Boolean::logicalAnd)或者reduce(Boolean::logicalOr),在一个boolean[]?毕竟,方法logicalAnd和logicalOr已经在Java中添加8,所以我可以做的这些归约操作Stream<Boolean>...顺便说一下,您可以流过char[]一样简单CharBuffer.wrap(array).chars()或者CharBuffer.wrap(array).codePoints(),这取决于你喜欢哪种语义。
Boolean::logicalAnd存在而已,并不一定保证存在BooleanStream。毕竟,这些可以在非流lambda情况下使用。我可以想像,有人会想这样做reduce(Boolean::logicalAnd),但在任何情况下,有没有人需要做到这一点。
while (i < limit),但是在任何情况下都不需要做(使用分支和跳转汇编指令)”
<Primitive>Stream,每个原始类型都没有的唯一原因是因为它会使API过度膨胀。正确的问题是“为什么在那里IntStream?” 不幸的答案是因为Java的类型系统不够充实,无法表达Stream<int>而没有使用的所有性能开销Integer。如果Java具有值类型,可以将值类型分配在堆栈上或直接内嵌在其他数据结构中,那么就不需要别的了Stream<T>
当然,答案是“ 因为这就是设计师的决定 ”。没有技术原因CharStream不能存在。
如果需要证明理由,通常需要打开OpenJDK邮件列表*。JDK的文档不习惯证明为什么是什么就是为什么。
有人问
使用IntStream表示字符/字节流有点不方便。我们应该同时添加CharStream和ByteStream吗?
Java语言架构师Brian Goetz的回复说
简短的回答:不。
对于几乎从未使用过的这些表单,每个JDK占用100K +的空间都不值得。如果我们添加了这些,那么有人会要求short,float或boolean。
换句话说,如果人们坚持认为我们拥有所有原始专业化知识,那么我们将没有原始专业化知识。这将比现状更糟。
他在别处也说过
如果您想将它们作为字符处理,则可以将它们轻松转换为字符。似乎没有足够重要的用例来拥有整个“另一组流”。(与Short,Byte,Float相同)。
TL; DR:不值得维护费用。
*如果您感到好奇,我使用的Google查询是
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint吗?
不仅char不支持数组。
只有3种原始流- IntStream,LongStream和DoubleStream。
其结果是,Arrays有一个转换方法int[],long[]并double[]以相应的原始流。
有对没有相应的方法boolean[],byte[],short[],char[]和float[],因为这些原始类型没有相应的原始流。
char是String-存储UTF-16值的从属部分。Unicode符号(一个代码点)有时是一个替代字符。因此,任何使用char的简单解决方案都仅覆盖Unicode域的一部分。
有一段时间,char它有自己的权利成为公共类型。但是现在最好使用代码点,IntStream。字符流无法直接处理代理对。
另一个比较平淡的原因是,JVM“处理器”模型使用int最小的“寄存器”,在这种int大小的存储位置中保留布尔值,字节,短裤和字符。为了不必膨胀Java类,请不要使用所有可能的复制变体。
在不久的将来,人们可能期望允许原始类型用作通用类型参数,从而提供一个List<int>。然后我们可能会看到一个Stream<char>。
目前最好避免char使用,并且可以使用java.text.Normalizer唯一的规范形式的代码点/ Unicode字符串。