Zipping-streams mit JDK8 mit lambda - (java.util.stream.Streams.zip)
In JDK 8 mit lambda-b93 es war ein Klasse java.util.stream.Streams.zip in der b93, die verwendet werden könnten, um zip-streams (dieser ist dargestellt in das tutorial Erkunden Java8-Lambdas. Teil 1 von Dhananjay Nene). Diese Funktion :
Schafft ein faul und sequentielle kombinierte Datenstrom, dessen Elemente die
Ergebnis der Kombination der Elemente der beiden Strömungen.
Jedoch in b98 verschwunden. Infact die Streams
- Klasse ist auch nicht zugänglich java.util.stream-b98.
Hat diese Funktionalität wurde verschoben, und wenn ja, wie kann ich zip-streams, die kurz und prägnant über b98?
Die Anwendung, die ich im Auge habe ist in diesem java-Implementierung von Shen, wo ich ersetzte die zip-Funktionalität in der
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
Funktionen mit eher ausführlichen code (die nicht mit der Funktionalität von b98).
mögliche Duplikate von Java 8 java.util.stream.Streams
"Die Erforschung Von Java8-Lambdas. Teil 1" - der neue link für diesen Artikel blog.dhananjaynene.com/2013/02/exploring-java8-lambdas-part-1
InformationsquelleAutor artella | 2013-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchte ich diese auch so ich habe nur den source code von der b93 und steckte es in eine "util" - Klasse. Ich musste Sie leicht modifizieren, um die Arbeit mit der aktuellen API.
Zur Referenz hier der funktionierende code (nehmen Sie es auf eigene Gefahr...):
SIZED
wenn entweder stream istSIZED
, nicht beide?Ich denke nicht so. Beide streams werden müssen
SIZED
für diese Umsetzung zu arbeiten. Es hängt tatsächlich davon ab, wie definieren Sie das packen. Sollten Sie in der Lage sein, um zip-zwei Ströme unterschiedlicher Größe, zum Beispiel? Was würde der resultierende Strom dann Aussehen? Ich glaube, das ist der Grund, warum diese Funktion eigentlich nicht in die API. Es gibt viele Möglichkeiten, dies zu tun, und es ist bis zum Benutzer, zu entscheiden, welches Verhalten sollte der "richtige". Würde Sie verwerfen die Elemente aus der mehr oder stream pad die kürzere Liste? Wenn ja, mit welchem Wert(en)?Es sei denn, ich bin fehlt etwas, gibt es keine Notwendigkeit für jede Umwandlung (z.B.
Spliterator<A>
).Gibt es eine website, wo die Java-8 b93 Quellcode gehostet wird? Ich habe Schwierigkeiten, es zu finden.
InformationsquelleAutor siki
zip ist eine der Funktionen, die das protonpack Bibliothek.
InformationsquelleAutor Dominic Fox
Wenn Sie Guave in Ihrem Projekt verwenden, können Sie die Streams.zip Methode (wurde Hinzugefügt, Guave 21):
InformationsquelleAutor ZhekaKozlov
Zippen zweier Ströme mit JDK8 mit lambda (gist).
import java.util.function.*;
undimport java.util.stream.*;
am Anfang der Datei.Beachten Sie, dass dies ist ein terminal-Betrieb auf dem stream. Dies bedeutet, dass für den unendlichen strömen, diese Methode bricht
So viel Unnützes Wrapper: Hier
() -> iterator
und auch hier wieder:iterable.spliterator()
. Warum nicht die Umsetzung direkt einenSpliterator
eher als eineIterator
? Check @Doradus Antwort stackoverflow.com/a/46230233/1140754InformationsquelleAutor Karol Król
Da kann ich mir nicht vorstellen, dass jede Verwendung von zipping auf Sammlungen anderer als indiziert (Liste) und ich bin ein großer fan von Einfachheit, das wäre meine Lösung:
mapToObject
solltemapToObj
.Danke für den Hinweis, es ist korrigiert
InformationsquelleAutor Rafael
Den Methoden der Klasse, die Sie erwähnt haben, wurde verschoben, um die
Stream
Schnittstelle selbst in Gunst, um die Standard-Methoden. Aber es scheint, dass diezip
Methode wurde entfernt. Vielleicht, weil es nicht klar ist, was das Standardverhalten für Verschieden große Ströme werden sollte. Aber die Umsetzung des gewünschten Verhaltens ist straight-forward:predicate
Sie an den filter übergeben und stateful? Das verstößt gegen die Methode, Vertrag und vor allem wird nicht funktionieren, wenn die Verarbeitung der Streams parallel.keiner hier die Lösung unterstützt die Parallelverarbeitung. Da meine Methoden nicht zurück, ein stream, stellen Sie sicher, dass die streams laufen nicht parallel. Ähnlich wie der code der akzeptierten Antwort-gibt einen stream, der gedreht werden kann, die in paralleler, aber nicht wirklich etwas tun, parallel. Das heißt, zustandsbehaftete Prädikate sind entmutigt, aber nicht gegen den Vertrag. Sie könnten auch parallel verwendet Kontext, wenn Sie sicherstellen, dass die state update "thread-safe". In manchen Situationen sind Sie unumgänglich, z.B. wenn ein stream in distinct zustandsbehaftete Prädikat per se.
können Sie erraten, warum diese Operationen entfernt wurden aus der Java-API...
InformationsquelleAutor Holger
Lazy-Seq-Bibliothek bietet die zip-Funktionalität.
https://github.com/nurkiewicz/LazySeq
Diese Bibliothek ist stark inspiriert von
scala.collection.immutable.Stream
Ziel unveränderlich, thread-sicher und einfach zu bedienen lazy sequence Umsetzung, möglicherweise unendlich.InformationsquelleAutor Nick Siderakis
Ich demütig vorschlagen dieser Implementierung. Der resultierende Strom wird abgeschnitten, um den kürzeren der beiden input-streams.
.., leftStream.isParallel() || rightStream.isParallel()
. Ich denke, dass es keinen Effekt hat, weilAbstractSpliterator
bietet begrenzte Parallelität standardmäßig. Also ich denke, dass das endgültige Ergebnis das gleiche wie die übergabefalse
.vielen Dank für Ihren Kommentar. Ich bin mir nicht sicher, was du meinst mit "begrenzten Parallelität von default" - hast du einen link zu Google docs?
InformationsquelleAutor Doradus
InformationsquelleAutor robby_pelssers
AOL cyclops-reagieren, zu denen ich beitragen, bietet auch zippen und Funktionalität, die beide über eine erweiterte Stream-Implementierung, das implementiert auch die reactive-streams-Schnittstelle ReactiveSeq, und über StreamUtils, bietet viel von der gleichen Funktionalität über statische Methoden der standard-Java-Streams.
Zudem bietet es mehr verallgemeinert Applicative basiert zippen. E. g.
Und auch die Fähigkeit zu-pair-Mädchen jedes Element in einem stream mit jedem item in einem anderen
InformationsquelleAutor John McClean
Unter Verwendung der neuesten Guava-library (für das
Streams
Klasse) Sie sollten in der Lage sein zu tunInformationsquelleAutor Dan Borza
Das ist großartig. Ich musste Reißverschluss zwei streams in eine Karte mit einem stream der Schlüssel und die andere den Wert
Ausgabe:
{A=Apfel B=Banane, C=Karotte}
InformationsquelleAutor Gnana
Wenn jemand braucht diese noch, es ist
StreamEx.zipWith
Funktion in streamex Bibliothek:InformationsquelleAutor const.grigoryev