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 .