1. 概述

本文将介绍几种将 Java 中的 IterableIterator 转换为 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 提供了 IterableUtilsIteratorUtils 工具类,方便转换操作。

IterableUtils.toList() 转换 Iterable

List<String> result = IterableUtils.toList(iterable);

IteratorUtils.toList() 转换 Iterator

List<String> result = IteratorUtils.toList(iterator);

6. 总结

本文介绍了将 IterableIterator 转换为 Collection 的多种方式,包括:

  • ✅ 纯 Java 实现(支持 Java 8+)
  • ✅ 使用 Guava 工具类
  • ✅ 使用 Apache Commons 工具类

如果你项目中已经引入了 Guava 或 Apache Commons,建议直接使用它们提供的工具方法,代码更简洁,可读性更强。否则,使用 Java 原生方式也是完全可行的。


原始标题:Converting Iterable to Collection in Java | Baeldung