1. 概述
在这个简短的教程中,我们将学习如何在Java中将Iterator转换为List。我们将介绍一些使用while循环、Java 8和一些常用库的示例。
我们将在所有示例中使用包含Integer的Iterator:
Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();
2. 使用While循环
让我们从Java 8之前传统上使用的方法开始。我们将使用while循环将Iterator转换为List:
List<Integer> actualList = new ArrayList<Integer>();
while (iterator.hasNext()) {
actualList.add(iterator.next());
}
assertThat(actualList, containsInAnyOrder(1, 2, 3));
3. 使用Java 8 Iterator.forEachRemaining
在Java 8及更高版本中,我们可以使用Iterator的forEachRemaining()方法来构建我们的List。我们将List接口的add()方法作为方法引用传递:
List<Integer> actualList = new ArrayList<Integer>();
iterator.forEachRemaining(actualList::add);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
4. 使用Java 8 Stream API
接下来,我们将使用Java 8 Stream API将Iterator转换为List。为了使用Stream API,我们需要先将Iterator转换为Iterable。我们可以使用Java 8 Lambda表达式来做到这一点:
Iterable<Integer> iterable = () -> iterator;
现在,我们可以使用StreamSupport类的stream()和collect()方法来构建List:
List<Integer> actualList = StreamSupport
.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
assertThat(actualList, containsInAnyOrder(1, 2, 3));
5. 使用Guava
Google的Guava库提供了创建可变和不可变List的选项,因此我们将看到这两种方法。
让我们首先使用ImmutableList.copyOf()方法创建一个不可变列表:
List<Integer> actualList = ImmutableList.copyOf(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
现在,让我们使用Lists.newArrayList()方法创建一个可变列表:
List<Integer> actualList = Lists.newArrayList(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
6. 使用Apache Commons
Apache Commons Collections库提供了处理列表的选项。我们将使用IteratorUtils进行转换:
List<Integer> actualList = IteratorUtils.toList(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
7. 总结
在本文中,我们介绍了一些将Iterator转换为List的选项。虽然还有一些其他方法可以实现这一点,但我们已经介绍了几个常用的选项。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章