Я хочу что-то вроде этого:
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 для достижения этого, или действительно ли это - единственный путь?
Нет, в Стандартном API ничего подобного нет.
В Java не идиоматично (и поэтому довольно редко) использовать Iterator
как часть API; они обычно производятся и немедленно потребляются.
Нет, но в библиотеке Google Collections есть хороший способ сделать это (если вы собираетесь использовать какую-то другую функцию - нет причин добавлять эту зависимость только для этого):
Iterators.addAll(targetCollection, sourceIterator);
В Guava (новая универсальная библиотека Java от Google, заменяющая коллекции Google) это может быть просто:
return Lists.newArrayList(fooIterator);
или если список будет доступен только для чтения:
return ImmutableList.copyOf(fooIterator);
Я не верю, что итераторы гарантированно остановятся после фиксированного количества итераций, поэтому, вероятно, это небезопасный способ вставки данных в ваш список . Рассмотрим фиктивную реализацию итератора, которая всегда возвращает константу 42
из вызовов next ()
. Вашему приложению быстро не хватит памяти.