有没有一种简单的方法可以将迭代器复制到 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 中的列表中?的主要内容,如果未能解决你的问题,请参考以下文章