将Iterator转换为List

评论 0 浏览 0 2019-06-26

1.概述

在这个简短的教程中,我们将学习如何将 Iterator 转换为 List 在 Java 中。我们将介绍一些使用 while 循环、Java 8 和一些常用库的示例。

对于所有示例,我们将使用带有 IntegerIterator

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 及更高版本中,我们可以使用 IteratorforEachRemaining() 方法来构建我们的 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 APIIterator 转换为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上找到。

最后更新2023-11-11
0 个评论
标签