«1. Обзор

В этом руководстве мы рассмотрим различные способы преобразования Iterable в Collection в Java.

Мы начнем с простых решений Java, а затем рассмотрим варианты, которые также предоставляют библиотеки Guava и Apache Commons.

2. Iterable и Iterator

Сначала мы определим наш Iterable:

Iterable<String> iterable = Arrays.asList("john", "tom", "jane");

Мы также определим простой Iterator, чтобы подчеркнуть разницу между преобразованием Iterable в Collection и Iterator в Collection :

Iterator<String> iterator = iterable.iterator();

3. Использование простой Java

3.1. Iterable to Collection

Мы можем использовать метод Java 8 forEach() для добавления всех элементов в список:

@Test
public void whenConvertIterableToListUsingJava8_thenSuccess() {
    List<String> result = new ArrayList<String>();
    iterable.forEach(result::add);

    assertThat(result, contains("john", "tom", "jane"));
}

Или использовать класс Spliterator для преобразования нашего Iterable в Stream, а затем в Collection:

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

~~ ~ 3.2. Iterator to Collection

С другой стороны, вместо использования forEach() мы будем использовать forEachRemaining() с Iterator:

@Test
public void whenConvertIteratorToListUsingJava8_thenSuccess() {
    List<String> result = new ArrayList<String>();
    iterator.forEachRemaining(result::add);

    assertThat(result, contains("john", "tom", "jane"));
}

Мы также можем создать Spliterator из нашего Iterator, а затем использовать его для преобразования Iterator в Поток:

List<String> result = 
  StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
    .collect(Collectors.toList());

3.3. Использование цикла For

Давайте также рассмотрим решение, использующее очень простой цикл for для преобразования нашего объекта Iterable в список:

@Test
public void whenConvertIterableToListUsingJava_thenSuccess() {
    List<String> result = new ArrayList<String>();
    for (String str : iterable) {
        result.add(str);
    }

    assertThat(result, contains("john", "tom", "jane"));
}

С другой стороны, мы будем использовать hasNext() и next() с итератором:

@Test
public void whenConvertIteratorToListUsingJava_thenSuccess() {
    List<String> result = new ArrayList<String>();
    while (iterator.hasNext()) {
        result.add(iterator.next());
    }

    assertThat(result, contains("john", "tom", "jane"));
}

4. Использование Guava

Есть также несколько доступных библиотек, которые предоставляют удобные методы, помогающие нам достичь этого.

Давайте посмотрим, как мы можем использовать Guava для преобразования из Iterable в List:

Мы можем создать новый List из Iterable или Iterator, используя Lists.newArrayList():

List<String> result = Lists.newArrayList(iterable);

Или мы можем использовать ImmutableList .copyOf():

List<String> result = ImmutableList.copyOf(iterable);

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

Наконец, мы будем использовать Apache Commons IterableUtils для создания списка из Iterable:

List<String> result = IterableUtils.toList(iterable);

Точно так же мы будем использовать IteratorUtils для создания Список из нашего итератора:

List<String> result = IteratorUtils.toList(iterator);

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

В этой короткой статье мы узнали, как преобразовать Iterable и Iterator в коллекцию с помощью Java. Мы исследовали различные способы использования простой Java и двух внешних библиотек: Guava и Apache Commons.

Как всегда, полный исходный код доступен на GitHub.