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

Posted

技术标签:

【中文标题】有没有一种简单的方法可以将迭代器复制到 Java 中的列表中?【英文标题】:Is there an easy way to copy an iterator into a list in Java? 【发布时间】:2011-02-17 15:28:30 【问题描述】:

我想要这样的东西:

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

【问题讨论】:

我认为您要么希望在该方法中“返回 fooList”,要么将 fooList 作为参数传递,否则该方法实际上基本上是无操作的(除了耗尽迭代器): ) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

Iterators.addAll(targetCollection, sourceIterator);

【讨论】:

【参考方案3】:

在Guava(Google 新的通用 Java 库,它取代了 google-collections)中,这可能很简单:

return Lists.newArrayList(fooIterator);

或者如果列表是只读的:

return ImmutableList.copyOf(fooIterator);

【讨论】:

或者,如果您想添加到现有集合中,实际上是 Iterators.addAll(卡尔建议)。【参考方案4】:

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

【讨论】:

【参考方案5】:

在 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

【讨论】:

以上是关于有没有一种简单的方法可以将迭代器复制到 Java 中的列表中?的主要内容,如果未能解决你的问题,请参考以下文章

Java中迭代器Iterator的使用

迭代器模式(Iterator Pattern)

Java学习之Iterator(迭代器)

有没有一种简单的方法可以将我在一个环境中拥有的相同 Python 库安装到新的 Python 环境中? [复制]

Java学习之Iterator(迭代器)的一般用法(转)

Java学习之Iterator(迭代器)的一般用法 (转)