Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,有没有一种简单的方法可以将迭代器复制到列表中?_Java_List_Iterator_Copy - Fatal编程技术网

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

在Java中,有没有一种简单的方法可以将迭代器复制到列表中?,java,list,iterator,copy,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&l

我想要这样的东西:

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>();
    fooIterator.forEachRemaining(fooList::add);
}
public void CopyIteratorIntoList(迭代器fooIterator){
列表列表=新的ArrayList();
愚人主义者addAll(fooIterator);
}
这应等同于:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) {
    List<Foo> fooList = new ArrayList<Foo>();
    while(fooIterator.hasNext())
        fooList.add(fooIterator.next());
}
public void CopyIteratorIntoList(迭代器fooIterator){
列表列表=新的ArrayList();
while(fooIterator.hasNext())
add(fooIterator.next());
}

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

没有,标准API中没有类似的方法


在Java中,使用
迭代器作为API的一部分并不惯用(因此相当少见);它们通常是生成并立即使用的。

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

否,但是(如果您要使用它的某些其他功能-没有理由为此添加依赖项):

在(取代Google collections的Google新的通用Java库)中,这可以是:

return Lists.newArrayList(fooIterator);
或者如果列表将是只读的:

return ImmutableList.copyOf(fooIterator);

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

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>();
    fooIterator.forEachRemaining(fooList::add);
}
public void CopyIteratorIntoList(迭代器fooIterator){
列表列表=新的ArrayList();
forEachRemaining(愚人::添加);
}

另请参见:

或者,实际上,如果要添加到现有集合,请参见Iterators.addAll(如Carl所建议)。我认为您可能希望在该方法中使用“return-woulist”,或者将woulist作为参数传递,因为否则该方法实际上基本上是一个no-op(除了耗尽迭代器外):)