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

Is there an easy way to copy an iterator into a list in Java?

我想要这样的东西:

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

应相当于:

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

API中是否有实现这一点的方法,或者这是唯一的方法?


不,在标准API中没有类似的东西。

在Java中,使用EDOCX1 0作为API的一部分并不是惯用的(通常是不常见的);它们通常是产生和立即消耗的。


在番石榴(谷歌的新通用Java库,它取代谷歌的集合),这可能是简单的:

1
return Lists.newArrayList(fooIterator);

或者如果列表是只读的:

1
return ImmutableList.copyOf(fooIterator);


不,但是Google收藏库有一个很好的方法来实现这一点(如果你打算使用它的一些其他功能——没有理由仅仅为了这个而添加这种依赖关系):

1
Iterators.addAll(targetCollection, sourceIterator);

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


在Java 8中,你可以这样做:

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

另请参见:将ITerable转换为集合的简单方法