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

时间:2010-05-10 11:58:45

标签: java list iterator copy

我想要这样的事情:

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中是否有任何方法可以实现,或者这是唯一的方法吗?

5 个答案:

答案 0 :(得分:11)

不,标准API中没有类似内容。

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

答案 1 :(得分:7)

不,但是Google Collections library has a nice way to do that(如果您将使用其中一些其他功能 - 没有理由为此添加该依赖项):

Iterators.addAll(targetCollection, sourceIterator);

答案 2 :(得分:7)

Guava(谷歌新的通用Java库,取代google-collections)中,这可能只是:

return Lists.newArrayList(fooIterator);

或如果列表是只读的:

return ImmutableList.copyOf(fooIterator);

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

另请参阅:Easy way to change Iterable into Collection