In Anbetracht Iterator<Element>
, wie können wir das konvertieren Iterator
zu ArrayList<Element>
(oder List<Element>
) in der besten und schnellsten Art und Weise möglich, dass so können wir verwenden ArrayList
‚s Operationen darauf, wie get(index)
, add(element)
etc.
241
In Java 8 können Sie die neue
forEachRemaining
Methode verwenden, die derIterator
Benutzeroberfläche hinzugefügt wurde :quelle
::
? Welchen Namen hat es? scheint ein direkter Verweis auf list.add () zu sein; und scheint auch etwas Java8 Neues zu sein; und danke! :)::
Syntax ist neu in Java 8 und bezieht sich auf eine "Methodenreferenz", bei der es sich um eine Kurzform eines Lambda handelt. Weitere Informationen finden Sie hier: docs.oracle.com/javase/tutorial/java/javaOO/…iterator
das es ist ein ungelöstes Symboliterator
.Sie können einen Iterator wie folgt in eine neue Liste kopieren:
Dies setzt voraus, dass die Liste Zeichenfolgen enthält. Es gibt wirklich keinen schnelleren Weg, eine Liste aus einem Iterator neu zu erstellen. Sie müssen sie nicht mehr manuell durchlaufen und jedes Element in eine neue Liste des entsprechenden Typs kopieren.
EDIT:
Hier ist eine generische Methode zum typsicheren Kopieren eines Iterators in eine neue Liste:
Verwenden Sie es so:
quelle
Beachten Sie, dass zwischen
Iterable
und ein Unterschied bestehtIterator
.Wenn Sie eine haben
Iterable
, können Sie mit Java 8 diese Lösung verwenden:Wie ich weiß,
Collectors.toList()
schafftArrayList
Instanz.Eigentlich sieht es meiner Meinung nach auch in einer Zeile gut aus.
Zum Beispiel, wenn Sie
List<Element>
von einer Methode zurückkehren müssen:quelle
Iterable
iterator
. Sie sind völlig anders.Iterator
zurück zu einem einmaligen GebrauchIterable
durch Verwendung() -> iterator
. Dies kann in solchen Situationen nützlich sein, aber lassen Sie mich noch einmal das Wichtige betonen: Sie können diese Methode nur verwenden, wenn eine einmalige VerwendungIterable
akzeptabel ist. Wenn Sieiterable.iterator()
mehr als einmal anrufen , erhalten Sie unerwartete Ergebnisse. Die obige Antwort wird dannIterator<Element> iterator = createIterator();
List<Element> array = StreamSupport.stream(((Iterable<Element>) () -> iterable).spliterator(), false).collect(toList());
Sie können auch
IteratorUtils
aus Apache Commons-Sammlungen verwenden , obwohl es keine Generika unterstützt:quelle
Ziemlich prägnante Lösung mit einfachem Java 8 unter Verwendung von
java.util.stream
:quelle
iterator.forEachRemaining( list::add )
, auch neu in Java 8, ist viel prägnanter. DasCollector
Verschieben der Listenvariablen in verbessert die Lesbarkeit in diesem Fall nicht, da sie von aStream
und a unterstützt werden mussSpliterator
.quelle
Versuchen
StickyList
von Cactoos :Haftungsausschluss: Ich bin einer der Entwickler.
quelle
Iterable
! =Iterator
Hier ist ein Einzeiler mit Streams
quelle
Ich möchte nur auf eine scheinbar offensichtliche Lösung hinweisen, die NICHT funktioniert:
Das liegt daran,
Stream#generate(Supplier<T>)
dass nur unendliche Streams erstellt werden können und nicht erwartet wird,NoSuchElementException
dass das Argument ausgelöst wird (dasIterator#next()
wird am Ende der Fall sein ).Die Antwort des xehpuk sollte stattdessen verwendet werden, wenn Sie den Iterator → Stream → List-Weg wählen .
quelle
benutze Google Guave !
++
quelle
Hier in diesem Fall
for loop
ist es besser, wenn Sie den schnellstmöglichen Weg wollen .Der Iterator über eine Stichprobengröße von
10,000 runs
Takes,40 ms
wie für Schleifen-Takes2 ms
Dies setzt voraus, dass die Liste Zeichenfolgen enthält.
quelle
for
Schleife und der Zugriff auf die Elemente einer Liste mitget(i)
schneller als die Verwendung eines Iterators ... aber das hat das OP nicht verlangt, er erwähnte ausdrücklich, dass ein Iterator als Eingabe angegeben wird.get(int)
Schleife sehen Sie nur 100.000 der 1-Meter-Einträge. Wenn Sie diese Schleife in ändern, werdenit.size()
Sie feststellen, dass diese beiden Methoden nahe an der gleichen Geschwindigkeit liegen. Im Allgemeinen liefern diese Arten von Java-Geschwindigkeitstests nur begrenzte Informationen zur tatsächlichen Leistung und sollten skeptisch betrachtet werden.