在本文中,我们将学习在 Java 中如何把一个 Iterator 转换成一个 List

为便于代码测试,我们在所有的示例代码中使用一个元素为字符串类型的 Iterator

1
2
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

方法一:使用 While 循环

一个容易想到的方法是使用 while 循环将 Iterator 转换为 List。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 此代码示例演示 while 循环方法的使用
package com.johnson.java.fundamentals.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

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

System.out.println(list);
}
}

/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

方法二:使用 Java 8 的 Iterator.forEachRemaining 方法

如果项目使用的是 Java 8 或是更高的版本,那么可以利用 IteratorforEachRemaining() 方法来构建 List。将 List 接口的 add() 方法作为方法引用传递,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 此代码示例演示 forEachRemaining() 循环方法的使用
package com.johnson.java.fundamentals.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

List<String> list = new ArrayList<>();

iterator.forEachRemaining(list::add);
System.out.println(list);
}
}
/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

方法三:使用 Java 8 Streams API

同样,如果项目使用的 Java 版本是 8 或 8 以上,我们可以使用 Streams API 将 Iterator 转换为 List。为了使用 Stream API,需要先将 Iterator 转换成 Iterable,可以使用 Java 8 Lambda 表达式来做到这一点:

1
2

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

接下来,使用 StreamSupport 类的 stream()collect() 方法来构建 List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 此代码示例演示 Streams API 循环方法的使用
package com.johnson.java.fundamentals.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

List<String> list = new ArrayList<>();

Iterable<String> iterable = () -> iterator;
list = StreamSupport
.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
System.out.println(list);
}
}
/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

方法四:使用 Guava 库

Google 的 Guava 库提供了创建可变和不可变 List 的方法,我们可以根据实际需要使用其中的一种。

添加 Guava 库依赖,建议使用最新版本(当前最新版本为 31.1-jre):

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>

使用 ImmutableList.copyOf() 方法创建一个不可变 List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.johnson.java.fundamentals.collections;

import com.google.common.collect.ImmutableList;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

List<String> list = new ArrayList<>();

list = ImmutableList.copyOf(iterator);
System.out.println(list);
}
}

/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

使用 Lists.newArrayList() 方法创建一个可变的 List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.johnson.java.fundamentals.collections;

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

List<String> list = new ArrayList<>();

list = Lists.newArrayList(iterator);
System.out.println(list);
}
}
/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

方法五:使用 Apache Commons Collections 库

Apache Commons Collections 库提供了 IteratorUtils 类可以将 一个 Iterator 转换成一个 List

添加依赖,建议使用最新版本(当前最新版本为 3.2.2):

1
2
3
4
5
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>

使用 IteratorUtils.toList()Iterator 转换成 List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.johnson.java.fundamentals.collections;

import org.apache.commons.collections.IteratorUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class IteratorToList {
public static void main(String[] args) {
Iterator<String> iterator = Arrays.asList("MONDAY", "TUESDAY", "WEDNESDAY",
"THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY").iterator();

List<String> list = new ArrayList<>();

list = IteratorUtils.toList(iterator);
System.out.println(list);
}
}
/*
此代码示例执行结果如下:

[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]

*/

小结

本文介绍了五种将 Iterator 转换为 List 的常用方法:

  • While 循环;
  • Java 8 高级特性:
    • Iterator.forEachRemaining 方法
    • Streams API
  • 第三方类库:
    • Google Guava 库
    • Apache Commons Collections 库

所有这些示例和代码片段的实现都可以在 GitHub 上找到。

(END)