2016-04-24 2 views
4

zu verwenden Ich sah gestern eine SO question über die Implementierung einer klassischen verknüpften Liste in Java. Es war eindeutig eine Aufgabe aus einem Bachelor-Klasse Datenstrukturen. Es ist einfach, Fragen und Implementierungen für Listen, Bäume usw. in allen Sprachen zu finden.Wie klassische benutzerdefinierte Datenstrukturen als Java 8 Streams

Ich habe über Java Lambdas gelernt und versuche, sie bei jeder Gelegenheit zu nutzen, um das Idiom unter meinen Fingern zu bekommen. Diese Frage ließ mich fragen: Wie würde ich eine benutzerdefinierte Liste oder einen Baum schreiben, damit ich sie in allen Java 8 Lambda-Maschinen verwenden könnte?

Alle Beispiele, die ich sehe, verwenden die eingebauten Sammlungen. Die arbeiten für mich. Ich bin mehr neugierig darauf, wie ein Professor, der Datenstrukturen unterrichtet, seine Techniken überdenken sollte, um Lambdas und funktionale Programmierung widerzuspiegeln.

Ich begann mit einem Iterator, aber es scheint nicht vollständig gekennzeichnet zu sein.

Hat jemand einen Rat?

+3

wie Solange Ihre benutzerdefinierte Collection das Collection-Interface implementiert, haben Sie die Methode 'stream()' und können yo verarbeiten ur benutzerdefinierte Klasse mit einer Stream-Pipeline. – Eran

+0

Danke Eran, ich werde es mit meiner Implementierung der verknüpften Liste versuchen und sehen, ob das mich aussortiert. – duffymo

Antwort

4

Ich würde für Inspiration http://www.javaslang.io betrachten, eine Bibliothek, die genau das tut, was Sie tun möchten: Implementieren Sie benutzerdefinierte Listen, Bäume usw. in einer Java 8-Weise.

Es nicht nicht eng mit den JDK-Sammlungen außerhalb der Import/Export-Methoden, aber Re-implementiert alle unveränderlichen Sammlung Semantik, die ein Scala (oder andere FP-Sprache) Entwickler erwarten würde.

+0

Danke Lukas, ich kannte diese Bibliothek nicht. Ich werde es mir ansehen. – duffymo

+1

Ich habe gerade die GitHub-Quelle heruntergezogen. Es ist viel umfangreicher als ich es erwartet hätte. Dieser Datenstrukturprofessor wird diese alten Notizen wegwerfen müssen. – duffymo

+1

@duffymo: In der Tat gibt es eine Welt jenseits der Java-Sammlungen :) (und Javaslang kratzt nur an der Oberfläche) –

9

Die Darstellung einer Stream-Ansicht beliebiger Datenstrukturen ist ziemlich einfach. Die Schlüsselschnittstelle, die Sie implementieren müssen, ist Spliterator, die, wie der Name schon sagt, zwei Dinge kombiniert - sequentiellen Elementzugriff (Iteration) und Zerlegung (Splitting).

Sobald Sie eine Spliterator haben, können Sie diese einfach in einen Stream mit verwandeln. In der Tat ist hier die stream() Methode von AbstractCollection (die meisten Sammlungen erben nur):

default Stream<E> stream() { 
    return StreamSupport.stream(spliterator(), false); 
} 

All die eigentliche Arbeit in der spliterator() Methode ist - und es gibt eine breite Palette von spliterator Qualität (das absolute Minimum Sie brauchen implementieren ist tryAdvance, aber wenn das alles, was Sie implementieren, wird es funktionieren sequentiell, wird aber verlieren auf den meisten der Strom Optimierungen.) Schauen Sie in den JDK Quellen Arrays.stream(), IntStream.range()) für Beispiele dafür, wie es besser zu machen.)