1. 概述
在本教程中,我们将探讨在 Java 中将可迭代对象转换为集合的不同方法。
我们将从简单的Java解决方案开始,然后看看番石榴和Apache共享资源库也提供的选项。
2. Iterable and Iterator
首先,我们将定义我们的可迭代:
Iterable<String> iterable = Arrays.asList("john", "tom", "jane");
我们还将定义一个简单的迭代器 - 以突出显示将可迭代转换为集合和迭代器转换为集合之间的区别:
Iterator<String> iterator = iterable.iterator();
3. 使用普通 Java
3.1. Iterable到Collection
我们可以使用 Java 8 forEach() 方法将所有元素添加到List中:
@Test
public void whenConvertIterableToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<String>();
iterable.forEach(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
或者使用拆分器类将我们的迭代器转换为流,然后转换为集合:
List<String> result =
StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
3.2. Iterator 到Collection
另一方面,我们将使用迭代器,而不是使用 forEach():
@Test
public void whenConvertIteratorToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<String>();
iterator.forEachRemaining(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
我们还可以从迭代器创建一个拆分器,然后使用它来将迭代器转换为流:
List<String> result =
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(Collectors.toList());
3.3. 使用 For 循环
让我们也看一个解决方案,它使用一个非常简单的for循环将我们的Iterable转换为列表:
@Test
public void whenConvertIterableToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<String>();
for (String str : iterable) {
result.add(str);
}
assertThat(result, contains("john", "tom", "jane"));
}
另一方面,我们将使用 hasNext() 和 next() 与迭代器:
@Test
public void whenConvertIteratorToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<String>();
while (iterator.hasNext()) {
result.add(iterator.next());
}
assertThat(result, contains("john", "tom", "jane"));
}
4. 使用Guava
还有一些库可用,它们提供了方便的方法来帮助我们实现这一目标。
让我们看看如何使用番石榴从可迭代转换为列表:
我们可以使用列表从可迭代或迭代器创建一个新的列表:
List<String> result = Lists.newArrayList(iterable);
或者我们可以使用不可变列表.
List<String> result = ImmutableList.copyOf(iterable);
5. 使用Apache Commons
最后,我们将使用Apache Commons迭代实用程序从迭代创建一个列表:
List<String> result = IterableUtils.toList(iterable);
同样,我们将使用迭代器Utils从迭代器创建一个列表:
List<String> result = IteratorUtils.toList(iterator);
6. 结论
在这篇简短的文章中,我们学习了如何使用 Java 将可迭代和迭代器转换为集合。我们探索了使用普通Java和两个外部库的不同方法:番石榴和阿帕奇共享资源。
与往常一样,完整的源代码可以在GitHub上获得。