Wie können wir angesichts von Iterator<Element>
Iterator
in ArrayList<Element>
(oder List<Element>
) auf die beste und schnellste-Weise umwandeln, damit wir die Operationen von ArrayList
wie get(index)
, add(element)
usw. verwenden können, usw.
Verwenden Sie besser eine Bibliothek wie Guava :
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
Ein anderes Guava-Beispiel:
ImmutableList.copyOf(myIterator);
oder Apache Commons-Sammlungen :
import org.Apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = ...//some iterator
List<Element> myList = IteratorUtils.toList(myIterator);
In Java 8 können Sie die neue forEachRemaining
-Methode verwenden, die der Iterator
-Schnittstelle hinzugefügt wurde:
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
Sie können einen Iterator wie folgt in eine neue Liste kopieren:
Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
copy.add(iter.next());
Dies setzt voraus, dass die Liste Zeichenfolgen enthält. Es gibt wirklich keinen schnelleren Weg, um eine Liste von einem Iterator neu zu erstellen. Sie müssen nicht mehr mit der Hand gehen und jedes Element in eine neue Liste des entsprechenden Typs kopieren.
BEARBEITEN:
Hier ist eine generische Methode, um einen Iterator typsicher in eine neue Liste zu kopieren:
public static <T> List<T> copyIterator(Iterator<T> iter) {
List<T> copy = new ArrayList<T>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
Verwenden Sie es so:
List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);
System.out.println(copy);
> [1, 2, 3]
Sie können auch IteratorUtils
aus Apache commons-collection verwenden, obwohl es keine Generics unterstützt:
List list = IteratorUtils.toList(iterator);
Beachten Sie, dass es einen Unterschied zwischen Iterable
und Iterator
gibt.
Wenn Sie eine Iterable
haben, können Sie mit Java 8 diese Lösung verwenden:
Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
Wie ich weiß, erstellt Collectors.toList()
eine ArrayList
-Instanz.
Eigentlich sieht es meiner Meinung nach auch in einer Zeile gut aus.
Zum Beispiel, wenn Sie List<Element>
von einer Methode zurückgeben müssen:
return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
Ziemlich prägnante Lösung mit einfachem Java 8 unter Verwendung von Java.util.stream
:
public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
return StreamSupport
.stream(
Spliterators
.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(
Collectors.toCollection(ArrayList::new)
);
}
List result = new ArrayList();
while (i.hasNext()){
result.add(i.next());
}
Die Java 8 forEachRemaining-Methode in Iterator kann hier verwendet werden:
List<Element> elementList = new ArrayList<>();
iterator.forEachRemaining(elementList::add);
Versuchen Sie StickyList
from Cactoos :
List<String> list = new StickyList<>(iterator);
Haftungsausschluss: Ich bin einer der Entwickler.
benutze google guava !
Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);
++
Ich möchte nur auf eine scheinbar offensichtliche Lösung hinweisen, die NICHT funktioniert:
List list = Stream.generate (Iterator :: next) .collect (Collectors.toList ());
Das liegt daran, dass Stream#generate(Supplier<T>)
nur unendliche Streams erstellen kann. Es wird nicht erwartet, dass sein Argument NoSuchElementException
auslöst (das ist es, was Iterator#next()
am Ende tut).
Die Antwort des xehpuk sollte stattdessen verwendet werden, wenn der Iterator → Stream → List-Weg Ihre Wahl ist.