在本文中,我们将学习在 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
| 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); } }
|
方法二:使用 Java 8 的 Iterator.forEachRemaining 方法
如果项目使用的是 Java 8 或是更高的版本,那么可以利用 Iterator
的 forEachRemaining()
方法来构建 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
| 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); } }
|
方法三:使用 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
| 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); } }
|
方法四:使用 Guava 库
Google 的 Guava 库提供了创建可变和不可变 List 的方法,我们可以根据实际需要使用其中的一种。
添加 Guava 库依赖,建议使用最新版本(当前最新版本为 31.1-jre):
1 2 3 4 5 6
| <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); } }
|
使用 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); } }
|
方法五:使用 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); } }
|
小结
本文介绍了五种将 Iterator
转换为 List
的常用方法:
- While 循环;
- Java 8 高级特性:
- Iterator.forEachRemaining 方法
- Streams API
- 第三方类库:
- Google Guava 库
- Apache Commons Collections 库
所有这些示例和代码片段的实现都可以在 GitHub 上找到。
(END)