«1. Обзор

В этом коротком руководстве мы узнаем, как преобразовать итератор в список в Java. Мы рассмотрим несколько примеров с использованием цикла while, Java 8 и нескольких распространенных библиотек.

Мы будем использовать итератор с целыми числами во всех наших примерах:

Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();

2. Использование цикла while

Начнем с подхода, который традиционно использовался до Java 8. Мы преобразуем итератор в Список с использованием цикла while:

List<Integer> actualList = new ArrayList<Integer>();
while (iterator.hasNext()) {
    actualList.add(iterator.next());
}

assertThat(actualList, containsInAnyOrder(1, 2, 3));

3. Использование Iterator.forEachRemaining() в Java 8

В Java 8 и более поздних версиях мы можем использовать метод forEachRemaining() в Iterator для построения списка. Мы передадим метод add() интерфейса List в качестве ссылки на метод:

List<Integer> actualList = new ArrayList<Integer>();
iterator.forEachRemaining(actualList::add);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

4. Использование API потоков Java 8

Далее мы будем использовать API потоков Java 8 для преобразования Iterator к списку. Чтобы использовать Stream API, нам нужно сначала преобразовать Iterator в Iterable. Мы можем сделать это, используя лямбда-выражения Java 8:

Iterable<Integer> iterable = () -> iterator;

Теперь мы можем использовать методы stream() и collect() класса StreamSupport для построения списка:

List<Integer> actualList = StreamSupport
  .stream(iterable.spliterator(), false)
  .collect(Collectors.toList());

assertThat(actualList, containsInAnyOrder(1, 2, 3));

5. Использование Guava ~~ ~ Библиотека Guava от Google предоставляет возможности для создания как изменяемых, так и неизменяемых списков, поэтому мы рассмотрим оба подхода.

Давайте сначала создадим неизменяемый список, используя метод ImmutableList.copyOf():

Теперь давайте создадим изменяемый список, используя метод Lists.newArrayList():

List<Integer> actualList = ImmutableList.copyOf(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

6. Использование Apache Commons ~ ~~ Библиотека Apache Commons Collections предоставляет опции для работы со списками. Мы будем использовать IteratorUtils для преобразования:

List<Integer> actualList = Lists.newArrayList(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

7. Заключение

В этой статье мы рассмотрели несколько вариантов преобразования Iterator в List. Хотя есть несколько других способов добиться этого, мы рассмотрели несколько часто используемых вариантов.

List<Integer> actualList = IteratorUtils.toList(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub.

«

The implementation of all these examples and code snippets can be found over on GitHub.