我想要这样的事情:
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中是否有任何方法可以实现,或者这是唯一的方法吗?
答案 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);
}