2017-01-02 4 views
3

Ich frage mich, warum Java 8 keine Unterstützung für die Verwendung von Datenströmen auf Arrays bietet, wie dies bei Sammlungen der Fall ist. Sie könnenWarum hat Java 8 keine Funktion "myArray.stream()"?

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

schreiben, aber man kann nicht schreiben:

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

Ich bin mir der Hilfsmethode Arrays.stream, so kann dies stattdessen verwendet werden:

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

Aber es lässt mich Ich frage mich, warum dieser plumpe Aufruf einer statischen Utility-Methode in einem Kontext erforderlich ist, in dem der Lambda-Ausdruck es erlaubt, einfach so viel Code zu schreiben. Mir ist der signifikante Unterschied zwischen der (objekt-/schnittstellenbasierten) Welt von Collection und der eher "nativen" Welt von array bekannt.

Wer kann näher darauf eingehen?

+0

Jemand wird besser antworten als ich, aber Arrays sind spezielle Objekt in Java, dies ist nicht von einer bestimmten Klasse/Interface wie 'Collection'. Sie haben nicht 'Array ' aber 'String []', das ist spezifisch für Arrays – AxelH

+2

Warum 'Stream' im Besonderen? Was ist mit anderen Methoden in der 'Collection' Schnittstelle? –

Antwort

1

Die Arrays sind vollständig in der Java Language Specfication angegeben. Wo alle Collection Klassen sind nur Teil der API. Und wie Sie sich vorstellen können, sind Änderungen an der Spezifikation teurer als Änderungen an der API.

Was Sie vorschlagen, würde nicht nur eine Ergänzung zu der Spezifikation bedeuten, sondern auch, dass die Klasse Stream in der Sprachspezifikation bekannt ist. Obwohl dies technisch möglich ist (siehe zum Beispiel Class und Object), ist dies nicht sehr üblich. Hinweis: Auch die Klassen Collection sind Teil der Sprachspezifikation.

3

Etwas ganz in der Nähe war, um Ihren Vorschlag discussed aber die Funktion Antrag wurde abgelehnt:

Was Sie vorschlagen, ist eine nicht-kleine Sprache-Funktion ein kleines Stück Zucker, etwas zu schaffen, bereits leicht tun können mit den Bibliotheken. Während wir die Möglichkeit erwogen haben, einen Mechanismus für das Injizieren von Methoden in Arrays hinzuzufügen, legen wir nahe, dass wir unser Komplexitätsbudget wahrscheinlich anderswo ausgeben sollten, wenn wir nicht einen anderen größeren Nutzen daraus ziehen können Dies.

+0

Danke für diesen Link! In dieser Diskussion fand ich auch diesen Hinweis sehr hilfreich: 'Das Hauptproblem ist, dass es derzeit keine 'echte' Methode für einen Array-Typ gibt. Normalerweise haben VMs eine spezielle Möglichkeit, sie zu repräsentieren, was Sie vorschlagen, erfordert große Änderungen von VM-Sicht. " – SebastianH

+0

Auf zweiten Gedanken und weitere Forschung ist dieses Zitat wirklich falsch! Sie müssen die VMs nicht ändern. Es kann vom Compiler gehandhabt werden.Und wenn ich mich nicht irre, wird dies bereits von Java 8 für die '::' method-as-a-parameter Spracherweiterung verwendet. – SebastianH

6

Um Methoden zu Arrays hinzuzufügen, muss die Sprache geändert werden, nicht die Bibliothek. Im Gegensatz zu "normalen" Objekten mit Membern, die in Klassendateien definiert sind, haben Arrays ihre Mitglieder definiert directly in the language specification.

Das bedeutet, dass das Hinzufügen der Methode myArray.stream() die Sprachspezifikation ändern und dem Compiler Unterstützung hinzufügen müsste. Dieser Ansatz ist wesentlich komplexer als das Hinzufügen von Arrays.stream(myArray), das mit sehr geringem Aufwand vollständig in der Java-Klassenbibliothek implementiert werden kann.