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.