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

Преобразование Iterable в коллекцию в Java

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

1. Обзор

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

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

2. Итерируемый и итератор

Во- первых, мы определим наш Iterable :

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

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

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

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

3.1. Итерируемый для коллекции

Мы можем использовать метод 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. Итератор в коллекцию

С другой стороны, вместо использования 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 в Stream :

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

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

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

@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() с Iterator :

@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 для преобразования Iterable в 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 из нашего Iterator :

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

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

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

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