将Iterator转换为List
1.概述
在这个简短的教程中,我们将学习如何将 Iterator 转换为 List 在 Java 中。我们将介绍一些使用 while 循环、Java 8 和一些常用库的示例。
对于所有示例,我们将使用带有 Integer 的Iterator:
Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();
2.使用While循环
让我们从 Java 8 之前传统上使用的方法开始。我们将convert Iterator to a List using a while 循环:
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 Streams API
接下来,我们将使用 Java 8 Streams 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 库 提供了创建可变对象和 immutable Lists, 所以我们将看到这两种方法。
让我们首先使用 ImmutableList.copyOf() 方法创建一个不可变的 List:
List<Integer> actualList = ImmutableList.copyOf(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
现在,让我们使用 Lists.newArrayList() 方法创建一个可变的 List:
List<Integer> actualList = Lists.newArrayList(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
6.使用Apache Commons
Apache Commons Collections库提供了对List的工作选项。我们将使用IteratorUtils来进行转换。
List<Integer> actualList = IteratorUtils.toList(iterator);
assertThat(actualList, containsInAnyOrder(1, 2, 3));
7.结语
在这篇文章中,我们介绍了将迭代器转换为List的几个选项。虽然还有一些其他的实现方式,但我们已经介绍了几个常用的选项。
所有这些例子和代码片断的实现都可以在GitHub上找到。