回答:
エランが言ったように、欠けているのはそれだけではない。
AはBooleanStream
、役に立たないであろうByteStream
(それが存在する場合)として扱うことができInputStream
、または変換IntStream
(CANなどshort
)、およびfloat
として扱うことができますDoubleStream
。
char
(リンク参照)とにかく、すべての文字を表現することはできません、それは次のようになりビットレガシーストリームの。とにかくほとんどの人はコードポイントを扱う必要がないので、奇妙に思えるかもしれません。String.charAt()
「これは実際にはすべてのケースで機能するわけではない」と考えずに使用することを意味します。
そのため、重要ではないと見なされたために除外されたものがあります。リンクされた質問でJB Nizetが言ったように:
他のタイプ(char、short、float)は相当なパフォーマンス(int、double)で表すことができるため、パフォーマンスを大幅に低下させることなく、プリミティブストリームを3タイプに制限することで、クラスとメソッドの爆発を回避することを明示的に選択しました。
理由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
。結局のところ、これらは非ストリームラムダ状況で使用できます。誰かがやりたいと思うことは想像できますreduce(Boolean::logicalAnd)
が、誰もがそうする必要はありません。
while (i < limit)
が、誰もそれを行う必要はありません[ブランチとジャンプのアセンブリ命令を使用して]」
<Primitive>Stream
すべてのプリミティブ型が存在しない唯一の理由は、APIが肥大化するためです。尋ねるべき正しい質問は、「なぜそこIntStream
にあるのか」ということです。残念な答えは、Javaの型システムはStream<int>
、を使用することによるパフォーマンスの費用をすべてかけずに表現できるほど具体化されていないためInteger
です。Javaに値型があり、スタックに割り当てたり、他のデータ構造内にインラインで直接埋め込んだりできる場合、それ以外には何も必要ありませんStream<T>
もちろん、答えは「それはデザイナーが決めたものだから」です。存在CharStream
できなかった技術的な理由はありません。
正当化したい場合は、通常、OpenJDKメーリングリストを有効にする必要があります*。JDKのドキュメントは、なぜ何かがなぜそうであるのかを正当化する習慣がありません。
誰かが尋ねました
IntStreamを使用して文字/バイトストリームを表すのは少し不便です。CharStreamとByteStreamも追加する必要がありますか?
Brian Goetz(Java Language Architect)からの返答
短い答え:いいえ。
ほとんど使用されることのないこれらのフォームについて、それぞれ100K以上のJDKフットプリントの価値はありません。これらを追加すると、誰かがshort、float、またはbooleanを要求します。
言い換えれば、人々が私たちがすべての原始的な専門化を持っていると主張したならば、私たちは原始的な専門化を持っていないでしょう。現状よりも悪いでしょう。
彼は他の場所でも同じことを言っています
それらを文字として扱いたい場合は、簡単にそれらを文字にダウンキャストできます。まったく別の一連のストリームを持つのに十分なほど重要なユースケースではないようです。(Short、Byte、Floatと同じ)。
TL; DR:維持費の価値はありません。
*ご参考までに、私が使用したGoogleクエリは
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint
ますか?
char
サポートされないのは配列だけではありません。
プリミティブストリームにはIntStream
、LongStream
との3つのタイプしかありませんDoubleStream
。
その結果、Arrays
はint[]
、long[]
およびdouble[]
対応するプリミティブストリームに変換するメソッドを持ちます。
そこには、対応する方法はありませんboolean[]
、byte[]
、short[]
、char[]
およびfloat[]
これらのプリミティブ型は何のプリミティブストリームを対応しておりますので、。
char
String
UTF-16値の格納の依存部分です。Unicodeシンボルであるコードポイントは、文字のサロゲートペアである場合があります。したがって、文字を使用した単純なソリューションは、Unicodeドメインの一部のみを対象としています。
char
パブリックタイプになる独自の権利があった時代がありました。しかし、今日では、コードポイント、IntStream
。charのストリームは、サロゲートペアを直接処理できませんでした。
もう1つのより一般的な理由は、JVMの「プロセッサ」モデルがint
最小の「レジスタ」を使用して、ブール値、バイト、ショート、さらに文字をそのようなintサイズの格納場所に保持することです。Javaクラスを膨らませる必要はないため、考えられるすべてのコピーバリアントを控えました。
では遠い将来の 1提供し、ジェネリック型パラメータとして機能させるプリミティブ型を期待するかもしれませんList<int>
。次に、が表示される場合がありStream<char>
ます。
今のところは避けたほうがよいchar
でしょうjava.text.Normalizer
。コードポイント/ Unicode文字列の一意の正規形式に使用することもできます。