Существует ли простой способ скопировать итератор в список в Java?

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

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 для достижения этого, или действительно ли это - единственный путь?

7
задан Björn Pollex 10 May 2010 в 11:58
поделиться

4 ответа

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

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

11
ответ дан 6 December 2019 в 06:13
поделиться

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

Iterators.addAll(targetCollection, sourceIterator);
7
ответ дан 6 December 2019 в 06:13
поделиться

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

return Lists.newArrayList(fooIterator);

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

return ImmutableList.copyOf(fooIterator);
7
ответ дан 6 December 2019 в 06:13
поделиться

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

3
ответ дан 6 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: