なぜchar []だけがArrays.stream()でサポートされていない配列なのですか?


43

プリミティブ配列をストリームに変換する方法を試してみたところ、char[]他のプリミティブ配列タイプはサポートされているが、サポートされていないことがわかりました。それらをストリームから除外する特別な理由はありますか?


3
stackoverflow.com/questions/22435833/…このスレッドIMOは関連する質問に対応します
Mark Bramnik

回答:


31

エランが言ったように、欠けているのはそれだけではない。

AはBooleanStream、役に立たないであろうByteStream(それが存在する場合)として扱うことができInputStream、または変換IntStream(CANなどshort)、およびfloatとして扱うことができますDoubleStream

char(リンク参照)とにかく、すべての文字を表現することはできません、それは次のようになりビットレガシーストリームの。とにかくほとんどの人はコードポイントを扱う必要がないので、奇妙に思えるかもしれません。String.charAt()「これは実際にはすべてのケースで機能するわけではない」と考えずに使用することを意味します。

そのため、重要ではないと見なされたために除外されたものがあります。リンクされた質問でJB Nizetが言ったように:

他のタイプ(char、short、float)は相当なパフォーマンス(int、double)で表すことができるため、パフォーマンスを大幅に低下させることなく、プリミティブストリームを3タイプに制限することで、クラスとメソッドの爆発を回避することを明示的に選択しました。

理由BooleanStreamは役に立たないでしょう。値が2つしかないため、操作が大幅に制限されるためです。数学的な演算は必要ありませんが、とにかくどれだけ頻繁に多くのブール値を処理していますか?


7
「A BooleanStreamは役に立たないだろう」:なぜ?
glglgl

12
たとえば、reduce(Boolean::logicalAnd)またはでreduce(Boolean::logicalOr)、誰かがする必要があると仮定することは本当に不合理boolean[]ですか?結局のところ、メソッドlogicalAndlogicalOr私は、これらの削減の操作を行うことができますので、Javaの8で追加されましたがStream<Boolean>...ところで、あなたは経由でストリーミングできるchar[]ように簡単としてCharBuffer.wrap(array).chars()CharBuffer.wrap(array).codePoints()、あなたが好むセマンティックた依存を。
Holger

2
@HolgerはBoolean::logicalAnd存在するからといって、必ずしもの存在を保証するものではありませんBooleanStream。結局のところ、これらは非ストリームラムダ状況で使用できます。誰かがやりたい思うことは想像できますreduce(Boolean::logicalAnd)が、誰もそうする必要はありません。
カヤマン

4
あなたがどのような主張をしようとしているのかわかりません。極端な形で:「誰かがやりたいと思うかもしれませんwhile (i < limit)が、誰もそれを行う必要はありません[ブランチとジャンプのアセンブリ命令を使用して]」
アレクサンダー-モニカ

11
<Primitive>Streamすべてのプリミティブ型が存在しない唯一の理由は、APIが肥大化するためです。尋ねるべき正しい質問は、「なぜそこIntStreamにあるのか」ということです。残念な答えは、Javaの型システムはStream<int>、を使用することによるパフォーマンスの費用をすべてかけずに表現できるほど具体化されていないためIntegerです。Javaに値型があり、スタックに割り当てたり、他のデータ構造内にインラインで直接埋め込んだりできる場合、それ以外には何も必要ありませんStream<T>
Alexander-Reinstate Monica

32

もちろん、答えは「それはデザイナーが決めたものだから」です。存在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

2
誰かが彼らが何を意味するのかを明確にでき100K+ of JDK footprintますか?
ヤシン

3
@yassin誰かがコードを書く必要があります。彼は、ストリームの各特殊化が100,000行を超えるコードであると推定しています
Michael

3
@BulgarSadykov「なぜXがYのようであるかについてのこのような質問は、原作者の心を読むことが不可能であり、彼らが偶然現れない限り、あなたが得るすべてが推測であるので、意見ベースとして閉じられることがよくあります。「ApacheのHTTPクライアントでPOSTリクエストを送信するにはどうすればよいですか?」なぜ図書館が通常は答えることができないように設計されているのか。我々はこれを答えることができます唯一の理由は、本当に彼らの会話の公的な記録がありますのでです。それが私が最初の文で達成しようとしていたことです。
マイケル

2
@BulgarSadykovそれはまた、C#について、しかし「なぜFooの機能は言語で実装されていません」のトピックに、エリックリッペルトのブログに言及し、これを連想させるstackoverflow.com/a/5588850/479251
Pac0

2
@BulgarSadykov敬具。繰り返しますが、「ApacheのHTTPクライアントでPOSTリクエストを送信するにはどうすればよいですか?」という質問の例を繰り返します。その質問への答えは明らかに「それがデザイナーが決定したものだからからは始まりません。言葉遣いは変えていません、ごめんなさい。
マイケル

7

charサポートされないのは配列だけではありません。

プリミティブストリームにはIntStreamLongStreamとの3つのタイプしかありませんDoubleStream

その結果、Arraysint[]long[]およびdouble[]対応するプリミティブストリームに変換するメソッドを持ちます。

そこには、対応する方法はありませんboolean[]byte[]short[]char[]およびfloat[]これらのプリミティブ型は何のプリミティブストリームを対応しておりますので、。


4
「これらのプリミティブタイプには、対応するプリミティブストリームがないため。」その後、フォローアップの質問は「なぜ」でしょうか?
Federico klez Culloca

7
@FedericoklezCullocaそのフォローアップの質問にここ
エラン

6

charStringUTF-16値の格納の依存部分です。Unicodeシンボルであるコードポイントは、文字のサロゲートペアである場合があります。したがって、文字を使用した単純なソリューションは、Unicodeドメインの一部のみを対象としています。

charパブリックタイプになる独自の権利があった時代がありました。しかし、今日では、コードポイントIntStream。charのストリームは、サロゲートペアを直接処理できませんでした。

もう1つのより一般的な理由は、JVMの「プロセッサ」モデルがint最小の「レジスタ」を使用して、ブール値、バイト、ショート、さらに文字をそのようなintサイズの格納場所に保持することです。Javaクラスを膨らませる必要はないため、考えられるすべてのコピーバリアントを控えました。

では遠い将来の 1提供し、ジェネリック型パラメータとして機能させるプリミティブ型を期待するかもしれませんList<int>。次に、が表示される場合がありStream<char>ます。

今のところは避けたほうがよいcharでしょうjava.text.Normalizer。コードポイント/ Unicode文字列の一意の正規形式に使用することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.