Есть ли простой способ скопировать итератор в список в Java? - PullRequest
7 голосов
/ 10 мая 2010

Я хочу что-то вроде этого:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    fooList.addAll(fooIterator);
}

, что должно быть эквивалентно:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    while(fooIterator.hasNext())
        fooList.add(fooIterator.next());
}

Есть ли в API какой-либо метод для достижения этого или это единственный способ?

Ответы [ 5 ]

11 голосов
/ 10 мая 2010

Нет, в Стандартном API ничего подобного нет.

В Java не является идиоматичным (и, следовательно, довольно редким) использовать Iterator как часть API; они обычно производятся и немедленно потребляются.

7 голосов
/ 10 мая 2010

В Гуава (новая универсальная Java-библиотека Google, которая заменяет Google-коллекции), это может быть просто:

return Lists.newArrayList(fooIterator);

или если список будет доступен только для чтения:

return ImmutableList.copyOf(fooIterator);
7 голосов
/ 10 мая 2010

Нет, но в библиотеке Google Collections есть хороший способ сделать это (если вы собираетесь использовать какую-то другую функцию - нет причин добавлять эту зависимость только для этого):

Iterators.addAll(targetCollection, sourceIterator);
3 голосов
/ 10 мая 2010

Я не верю, что итераторы гарантированно останавливаются после фиксированного числа итераций, поэтому, вероятно, это не безопасный способ вставить данные в ваш список. Рассмотрим фиктивную реализацию итератора, которая всегда возвращает константу 42 из вызовов к next(). Ваше приложение быстро исчерпает память.

1 голос
/ 03 февраля 2016

В Java 8 вы можете сделать это так:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    fooIterator.forEachRemaining(fooList::add);
}

См. Также: Простой способ преобразования Iterable в коллекцию

...