Iterator<Element>
が与えられたら、そのIterator
を最善かつ最速の方法でArrayList<Element>
(またはList<Element>
)に変換して、get(index)
、add(element)
などのArrayList
の操作を使用することができます。等.
Guava のようなライブラリを使用してください。
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
もう一つのグアバの例:
ImmutableList.copyOf(myIterator);
または Apache Commons Collections :
import org.Apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = ...//some iterator
List<Element> myList = IteratorUtils.toList(myIterator);
Java 8では、forEachRemaining
インターフェースに追加された新しいIterator
メソッドを使用できます。
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
このように、イテレータを新しいリストにコピーすることができます。
Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
copy.add(iter.next());
これは、リストに文字列が含まれていることを前提としています。イテレータからリストを再作成するより速い方法は実際にはありません、あなたは手でそれを辿り、それぞれの要素を適切な型の新しいリストにコピーすることに行き詰まっています。
編集:
これは、タイプセーフな方法でイテレータを新しいリストにコピーするための一般的な方法です。
public static <T> List<T> copyIterator(Iterator<T> iter) {
List<T> copy = new ArrayList<T>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
このように使用してください。
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]
Apache のcommons-collections から IteratorUtils
を使うこともできますが、そうではありません。ジェネリックスをサポートしていません。
List list = IteratorUtils.toList(iterator);
Iterable
と Iterator
には違いがあります。
Iterable
がある場合は、Java 8ではこの解決法を使用できます。
Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
私が知っているようにCollectors.toList()
はArrayList
インスタンスを作成します。
実は私の意見では、それはまた一行でよさそうです。
たとえば、何らかのメソッドからList<Element>
を返す必要がある場合は、次のようにします。
return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
Java.util.stream
を使用したプレーンJava 8での非常に簡潔な解決策:
public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
return StreamSupport
.stream(
Spliterators
.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(
Collectors.toCollection(ArrayList::new)
);
}
IteratorのJava 8 forEachRemainingメソッドは、ここで使用できます。
List<Element> elementList = new ArrayList<>();
iterator.forEachRemaining(elementList::add);
List result = new ArrayList();
while (i.hasNext()){
result.add(i.next());
}
google guava を使用してください。
Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);
++
私は、がうまくいかないうまくいかないように見える一見明白な解決策を指摘したいだけです:
リストlist = Stream.generate(iterator :: next) .collect(Collectors.toList());
それは、 Stream#generate(Supplier<T>)
が無限のストリームしか作成できないからです。 NoSuchElementException
(それが Iterator#next()
が最後にすることです).
xehpukの答え は、イテレータ→ストリーム→リストの方法があなたの選択であれば代わりに使われるべきです。