Convertendo iterável em coleção em Java

Convertendo iterável em coleção em Java

1. Visão geral

Neste tutorial,we’ll explore different ways to convert an Iterable to a Collection in Java.

Começaremos com soluções Java simples e, em seguida, daremos uma olhada nas opções que as bibliotecas Guava e Apache Commons também oferecem.

2. Iterable eIterator

Primeiro, vamos definir nossoIterable:

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

Também definiremos umIterator simples - para destacar a diferença entre converterIterable emCollection eIterator emCollection:

Iterator iterator = iterable.iterator();

3. Usando Plain Java

3.1. Iterable aCollection

Podemosuse the Java 8 forEach() method to add all elements to the List:

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

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

Ouuse the Spliterator class to convert our Iterable to Stream then to Collection:

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

3.2. Iterator aCollection

Por outro lado, em vez de usarforEach(), usaremosforEachRemaining() comIterator:

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

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

Também podemos criar umSpliterator de nossoIterator e usá-lo para converterIterator emStream:

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

3.3. Usando um loop For

Vamos também dar uma olhada em uma solução que usa um loop for muito simples para converter nossoIterable emList:

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

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

Por outro lado, usaremoshasNext()enext() comIterator:

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

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

4. Usando goiaba

Existem também algumas bibliotecas disponíveis que fornecem métodos convenientes para nos ajudar a conseguir isso.

Vamos ver como podemos usarGuava para converter de umIterable para umList:

Podemos criar um novoList deIterable ouIterator usandoLists.newArrayList():

List result = Lists.newArrayList(iterable);

Ou podemos usarImmutableList.copyOf():

List result = ImmutableList.copyOf(iterable);

5. Usando o Apache Commons

Finalmente,we’ll use Apache Commons IterableUtils to create a List from Iterable:

List result = IterableUtils.toList(iterable);

Da mesma forma, usaremosIteratorUtils para criar umList de nossoIterator:

List result = IteratorUtils.toList(iterator);

6. Conclusão

Neste breve artigo, aprendemos como converterIterableeIterator emCollection usando Java. Exploramos maneiras diferentes usando Java simples e duas bibliotecas externas: Guava e Apache Commons.

Como sempre, o código-fonte completo está disponível emGitHub.