«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.