2016-05-06 6 views
0

zu iterieren. Es ist mir nicht möglich, das zweite Mal über den mit Steam.spliterator erstellten Stream zu iterieren. Ich konnte keine Dokumentation darüber finden. HierEs ist nicht möglich, über den erzeugten Stream (zweites Mal) mit Steam.spliterator auf einem Iterable

ist das, was ich tue:

Ich habe eine Iterable als funciton Argument und ich bin Iterieren dieser über den Strom wie folgenden Code:

StreamSupport.stream(values.spliterator(), false) 

und nach, dass ich es wieder tue, aber die der zweite iteriert überhaupt nicht. Ich habe viel Zeit damit verbracht, es zu debuggen und schließlich das iterable am Anfang in eine Liste umgewandelt.

Kennt jemand von euch den Grund?

Edit: Sorry, wenn ich nicht klar bin,

ich nicht die Stream mehrmals mit wurde, war ich den Strom in der oben beschriebenen Weise mit dem gleichen Iterable zu erzeugen.

Iterable ist derjenige, der von MapReduce reduziert wird.

Danke, Hareendra

+0

Verwenden Sie dasselbe Iterator-Objekt oder generieren Sie ein neues? – dahui

+1

Sie können nur einmal einen 'Stream' und damit einen' Spliterator' verwenden; deshalb – fge

+0

Ich habe das Iterable (in obigen Beispielwerten). Ich erstelle einen Stream mit StreamSupport.stream (values.spliterator(), false) –

Antwort

0

A Stream ist ein One-Shot-Objekt. Sie können es nur einmal und nicht mehrmals verwenden. Wenn Sie den Inhalt mehrmals verwenden möchten, müssen Sie das tun, indem Sie den Stream in eine Liste oder ein Array oder etwas Nicht-Streamy konvertieren und dann zwei neue Streams daraus für die zwei Dinge erstellen, die Sie tun möchten.

Zitat aus JavaDoc of Stream Klasse:

Ein Strom betrieben werden, sollte nur einmal auf (oder eine Zwischenklemmenstrom Operation aufruft). Dies schließt zum Beispiel "gegabelte" Ströme aus, wobei die gleiche Quelle zwei oder mehr Pipelines oder mehrere Traversierungen des gleichen Stroms speist.

+0

Bitte beachten Sie die Änderungen –

+0

Also? Zumindest ist Ihr Titel falsch, was besagt, dass Sie 'Stream.spliterator()' verwenden, was bedeutet, dass 'Werte' ein' Stream' ist und somit nicht doppelt verwendet werden kann. – Vampire

+0

Nicht wirklich. Du sagst immer noch, dass du 'Stream.splitator()' nennst, also ist 'values' ein Stream oder nicht? Wenn es ein 'Iterable' ist, dann repariere deinen Beitrag. – Vampire

0

Seien Sie sicher, dass die Iterable Instanz Sie Spliterator wirklich die Iterable Vertrag honoriert erstellen verwenden. Einige Leute machen den Fehler zu denken, dass alles, was iterator() implementiert, als Iterable dienen wird, und das ist nicht der Fall. Um den Iterable Vertrag zu erfüllen, muss man iterator() mehrfach aufrufen können und jedes Mal mit ihm iterieren können.

Da es sehr einfach ist, ein Iterable von allem zu erstellen, das eine iterator() Funktion hat, habe ich mehrere Fälle eines hergestellten Iterable gesehen, das das Verhalten zeigt, das Sie erwähnen. Zum Beispiel kann man dies tun:

Stream<String> stream = ... 
Iterable<String> falseIterable = stream::iterator; 

falseIterable nicht Iterable Semantik, weil falseIterable.iterator() erforderlich folgen, ein Wrapper um sein stream.iterator(), ein brauchbares Iterator ein zweites Mal nicht zurück, sobald es iteriert wurde.

Verwandte Themen