Java Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course (COVID-pricing ends in January):

>> CHECK OUT THE COURSE

1. Overview

In this short tutorial, we'll learn how to convert an Iterator to a List in Java. We'll cover a few examples using a while loop, Java 8, and a few common libraries.

We'll use an Iterator with Integers for all our examples:

Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();

2. Using a While Loop

Let's begin with the approach traditionally used before Java 8. We'll convert the Iterator to a List using a while loop:

List<Integer> actualList = new ArrayList<Integer>();
while (iterator.hasNext()) {
    actualList.add(iterator.next());
}

assertThat(actualList, containsInAnyOrder(1, 2, 3));

3. Using Java 8 Iterator.forEachRemaining

In Java 8 and later, we can use the Iterator‘s forEachRemaining() method to build our List. We'll pass the add() method of the List interface as a method reference:

List<Integer> actualList = new ArrayList<Integer>();
iterator.forEachRemaining(actualList::add);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

4. Using the Java 8 Streams API

Next, we'll use the Java 8 Streams API to convert the Iterator to a List. In order to use the Stream API, we need to first convert the Iterator to an Iterable. We can do this using Java 8 Lambda expressions:

Iterable<Integer> iterable = () -> iterator;

Now, we can use the StreamSupport class' stream() and collect() methods to build the List:

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

assertThat(actualList, containsInAnyOrder(1, 2, 3));

5. Using Guava

The Guava library from Google provides options to create both a mutable and immutable Lists, so we'll see both approaches.

Let's first create an immutable List using ImmutableList.copyOf() method:

List<Integer> actualList = ImmutableList.copyOf(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

Now, let's create a mutable List using Lists.newArrayList() method:

List<Integer> actualList = Lists.newArrayList(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

6. Using Apache Commons

The Apache Commons Collections library provides options to work on a List. We'll use IteratorUtils to do the conversion:

List<Integer> actualList = IteratorUtils.toList(iterator);

assertThat(actualList, containsInAnyOrder(1, 2, 3));

7. Conclusion

In this article, we've covered a few options for converting an Iterator to a List. While there are a few other ways of achieving this, we've covered several commonly used options.

The implementation of all these examples and code snippets can be found over on GitHub.

Java bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course (COVID-pricing ends in January):

>> CHECK OUT THE COURSE
Comments are closed on this article!