Перейти к основному содержимому

Преобразование итератора в список

· 2 мин. чтения

1. Обзор

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

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

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

Далее мы будем использовать Java 8 Streams API для преобразования Iterator в List . Чтобы использовать 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 от Google предоставляет возможности для создания как изменяемых, так и неизменяемых списков , поэтому мы рассмотрим оба подхода.

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

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

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

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

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

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

6. Использование Apache Commons

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

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

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

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

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

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