2017-01-02 22 views
3

なぜJava 8には、コレクションと同じ方法で配列にストリームを使用するサポートが含まれていないのだろうか。あなたはJava 8に「myArray.stream()」関数がないのはなぜですか?

Collection<String> myCollection = new ArrayList<String>(); 
    Stream<String> stream = myCollection.stream(); 

を書くことができますが、書き込むことはできません。

String[] myArray = new String[] {}; 
    Stream<String> stream = myArray.stream(); 

私はユーティリティメソッドArrays.streamの認識していますので、これを代わりに使用することができますされています

Stream<String> stream = Arrays.stream(myArray); 

しかし、それは私の葉ラムダ式が単純にそれほどコード化することができない文脈で静的ユーティリティメソッドのこの不器用な呼び出しがなぜ必要であるのかと疑問に思います。私はCollectionの(オブジェクト/インターフェースに基づく)世界とarrayというより多くの "ネイティブ"世界との間の重要な違いを認識しています。

誰がこれについて詳しく説明できますか?あなたの提案に非常に近い

+0

誰かが私よりもうまく答えますが、配列はJavaの特別なObjectです。これは 'Collection'のような特定のClass/Interfaceのものではありません。あなたは 'Array 'を持っていませんが、 'String []'はありません。これは配列 – AxelH

+2

に特有です。特に 'stream'なぜですか? 'Collection'インターフェースの他のメソッドはどうですか? –

答えて

1

アレイは、Java Language Specficationで完全に指定されています。すべてのCollectionのクラスはAPIの一部にすぎません。そして、あなたが考えているように、仕様の変更はAPIの変更よりも費用がかかります。

あなたの提案は、仕様への追加だけでなく、クラスStreamが言語仕様で知られていることを意味します。これは技術的に可能ですが(例えばClassObjectを参照)、これはあまり一般的ではありません。 Collectionクラスも言語仕様の一部であることに注意してください。

3

何かだったdiscussedが、機能要求を拒否しました:あなたが示唆している何

は、すでに簡単に行うことができます何かに砂糖の小さなビットを提供するために、小さくない言語機能ですライブラリと一緒に。したがって、配列にメソッドを注入するメカニズムを追加する可能性を考慮していますが、配列をこのようにラップすることの容易さは、他の場所で複雑な予算を費やすほうが良いということを示唆しています。この。

+0

そのリンクをありがとう!この議論では、私はこのヒントを非常に参考にしていることも発見しました。「主な問題は、現在、配列型には「実際の」メソッドがないため、通常VMはそれらを表現する特別な方法を持っています。 VMの視点。 – SebastianH

+0

2番目の考えとさらなる研究では、この引用符は実際に間違っています! VMを変更する必要はありません。これはコンパイラで処理できます。私が誤解していないならば、これはすでにJava 8では '::'メソッドのパラメータとしての言語拡張のために使われています。 – SebastianH

6

配列にメソッドを追加するには、ライブラリではなく言語を変更する必要があります。クラスファイルでメンバーが定義された「通常の」オブジェクトとは異なり、配列のメンバはdirectly in the language specificationです。

これは、myArray.stream()メソッドを追加すると、言語仕様を変更し、コンパイラにサポートを追加する必要があることを意味します。このアプローチは、少しの労力でJavaクラスライブラリ内に完全に実装できるArrays.stream(myArray)を追加するよりもはるかに複雑です。

関連する問題