在Java中,有没有一种简单的方法将迭代器复制到列表中?

7

我想要类似这样的东西:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    fooList.addAll(fooIterator);
}

这应该与以下内容等效:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    while(fooIterator.hasNext())
        fooList.add(fooIterator.next());
}

有没有API中的方法可以实现这一点,还是这是唯一的方法?

我认为你要么想在那个方法中使用'return fooList',要么将fooList作为参数传入,否则该方法实际上基本上是一个无操作(除了用尽迭代器):) - Cowan
5个回答

11

标准API中没有类似的内容。

在Java中,将Iterator作为API的一部分使用并不习惯(因此相当罕见);它们通常是生产并立即消费的。


7
不,但是Google Collections library提供了一种很好的方法来实现这个功能(如果你将使用它的其他函数,那么添加这个依赖项就没有必要了):
Iterators.addAll(targetCollection, sourceIterator);

7
Guava(谷歌的新通用Java库,取代google-collections),这可以简单地实现:
return Lists.newArrayList(fooIterator);

或者,如果列表将是只读的:
return ImmutableList.copyOf(fooIterator);

或者,如果您想要添加到现有的集合中,则可以使用Iterators.addAll(如Carl所建议的)。 - Cowan

3

我不相信迭代器在固定数量的迭代后保证停止,因此这可能不是向列表中插入数据的安全方法。考虑一个虚拟的迭代器实现,它总是从对next()的调用中返回常量42。你的应用程序很快就会耗尽内存。


1
在Java 8中,您可以像这样做:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    fooIterator.forEachRemaining(fooList::add);
}

另请参阅: 将可迭代对象转换为集合的简单方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接