プリミティブな配列をストリームに変換する方法を調べていると、他のプリミティブな配列タイプはサポートされているのに、char[]
はサポートされていないことがわかりました。他のプリミティブ配列型はサポートされているのに、char[]
はサポートされていません。
もちろん、答えは "because's what the designers decided"です。なぜCharStream
が存在しないのかという技術的な理由はありません。
正当な理由を知りたければ、通常はOpenJDKのメーリングリスト*を参照する必要があります。JDKのドキュメントは、何かがなぜそうなっているのかを正当化する習慣がありません。
ある人が
IntStreamを使ってchar/byteストリームを表現するのはちょっと 不便です。CharStreamやByteStreamも追加したほうがいいのでしょうか?
ブライアン・ゲッツ(Java Language Architect)からの返信によると
簡単に言うと、「いいえ」です。 となっています。 これらのフォームのために、JDKのフットプリントを10万以上増やす価値はありません。 これらはほとんど使用されません。 また、これらを追加した場合、誰かが short、float、booleanを要求します。
別の言い方をすれば、もし人々がすべてのプリミティブな 別の言い方をすると、もし人々がすべてのプリミティブな特殊化を持っていると主張するなら、プリミティブな特殊化は存在しないことになります。 これは 現状よりも悪くなってしまいます。
また、別の場所でも同じことを言っています。
また、他の場所でも同じことが書かれていますが、チャージャーとして扱いたいのであれば と言っています。 重要なユースケースとは思えません。 別のストリームのセットを用意するほど重要なユースケースとは思えません。 (Short、Byte、Floatも同様です。 Floatと同じです)。
TL;DR:メンテナンスコストに見合わない。
*因みに、私が使ったグーグルのクエリは
site:http://mail.openjdk.java.net/ charstream
Eran氏が言うように、それだけが欠けているわけではない。
BooleanStreamは役に立たないでしょうし、
ByteStreamは(もし存在したとしても)
InputStreamとして扱うか、
IntStreamに変換することができます(
shortと同様に)し、
floatは
DoubleStream`として扱うことができます。
また、char
はすべての文字を表現できないので(リンク先参照)、レガシーストリームのビットになります。とはいえ、ほとんどの人はコードポイントを扱う必要がないので、不思議に感じるかもしれません。つまり、String.charAt()
を、`quot;this doesn't actually work in all cases"と考えずに使っているということです。
つまり、それほど重要ではないと考えられたために、いくつかのことが省かれたのです。リンク先の質問](https://stackoverflow.com/questions/22435833/why-is-string-chars-a-stream-of-ints-in-java-8)でJB Nizet氏が言っています。
設計者は、クラスとメソッドの爆発的増加を避けるために、明示的にクラスとメソッドの数を制限することを選択しました。 設計者は、プリミティブストリームを3種類に限定することで、クラスやメソッドの爆発を避けることを明確に選択しました。 他の型(char, short, float)は、より大きな型(int, double)で表すことができます。 他の型(char, short, float)は、同等の型(int, double)で表現することができ、 性能的にも大きな問題はありません。
BooleanStream`が使い物にならないのは、値が2つしかないので、操作がかなり制限されるからです。数学的な操作はできませんし、たくさんのブール値を扱うことはあまりないでしょう。
サポートされていないのはchar
配列だけではありません。
プリミティブなストリームには、IntStream
、LongStream
、DoubleStream
の3種類しかありません。
そのため、Arrays
にはint[]
, long[]
, double[]
を対応するプリミティブストリームに変換するメソッドがあります。
boolean[],
byte[],
short[],
char[],
float[]` には対応するメソッドがありません。これらのプリミティブ型には対応するプリミティブストリームがないからです。
charは
String` の従属部分であり、UTF-16の値を格納します。Unicodeシンボルである_code point_は、時にcharsetの代用となることがあります。そのため、charを使った単純な解決策は、Unicodeドメインの一部をカバーしているに過ぎません。
かつては char
がそれ自体がパブリック型としての権利を持っていた時期もありました。しかし、最近では コードポイント、IntStream
を使う方が良いでしょう。charのストリームでは、サロゲートペアを簡単に扱うことができませんでした。
もう一つのもっと平凡な理由は、JVMの「プロセッサ」モデルでは、最小の「レジスタ」として int
を使用して、ブーリアン、バイト、ショート、そして文字をこのようなintサイズの格納場所に保持しているからです。必ずしもjavaクラスを肥大化させないために、すべての可能なコピーバリアントを控えています。
遠い将来](https://openjdk.java.net/jeps/218)では、`Listを提供して、一般的な型パラメータとして機能することが許されるプリミティブ型を期待するかもしれません。そうすれば、
Stream
当面は char
は避けた方が良いでしょう。また、コードポイント/ユニコード文字列の一意な正規形として java.text.Normalizer
を使うかもしれません。