1. 概述
本文将介绍几种将 Java 中的 Iterable
和 Iterator
转换为 Collection
(如 List
)的常用方法。
我们会先介绍纯 Java 的实现方式,然后介绍使用 Guava 和 Apache Commons 这两个常用库的转换方式。
2. Iterable 与 Iterator 的定义
我们先定义一个 Iterable
示例:
Iterable<String> iterable = Arrays.asList("john", "tom", "jane");
同时,我们也可以从 Iterable
获取一个 Iterator
,用于对比两者的转换方式:
Iterator<String> iterator = iterable.iterator();
3. 使用纯 Java 实现转换
3.1. Iterable 转 Collection
✅ 使用 Java 8 的 forEach()
方法:
@Test
public void whenConvertIterableToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<>();
iterable.forEach(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
✅ **使用 Spliterator
转换为 Stream
,再收集为 List
**:
List<String> result =
StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
3.2. Iterator 转 Collection
✅ 使用 forEachRemaining()
方法:
@Test
public void whenConvertIteratorToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<>();
iterator.forEachRemaining(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
✅ 通过 Spliterator
构建 Stream
并转换:
List<String> result =
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(Collectors.toList());
3.3. 使用传统 for 循环
✅ Iterable
使用增强型 for 循环:
@Test
public void whenConvertIterableToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<>();
for (String str : iterable) {
result.add(str);
}
assertThat(result, contains("john", "tom", "jane"));
}
✅ **Iterator
使用 hasNext()
和 next()
**:
@Test
public void whenConvertIteratorToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<>();
while (iterator.hasNext()) {
result.add(iterator.next());
}
assertThat(result, contains("john", "tom", "jane"));
}
4. 使用 Guava
Guava 提供了一些便捷的方法来处理集合操作。
✅ 使用 Lists.newArrayList()
创建 List:
List<String> result = Lists.newArrayList(iterable);
✅ 使用 ImmutableList.copyOf()
创建不可变 List:
List<String> result = ImmutableList.copyOf(iterable);
5. 使用 Apache Commons
Apache Commons Collections 提供了 IterableUtils
和 IteratorUtils
工具类,方便转换操作。
✅ IterableUtils.toList()
转换 Iterable:
List<String> result = IterableUtils.toList(iterable);
✅ IteratorUtils.toList()
转换 Iterator:
List<String> result = IteratorUtils.toList(iterator);
6. 总结
本文介绍了将 Iterable
和 Iterator
转换为 Collection
的多种方式,包括:
- ✅ 纯 Java 实现(支持 Java 8+)
- ✅ 使用 Guava 工具类
- ✅ 使用 Apache Commons 工具类
如果你项目中已经引入了 Guava 或 Apache Commons,建议直接使用它们提供的工具方法,代码更简洁,可读性更强。否则,使用 Java 原生方式也是完全可行的。