Is there an easy way to copy an iterator into a list in Java?
我想要这样的东西:
1 2 3 4 | public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { List<Foo> fooList = new ArrayList<Foo>(); fooList.addAll(fooIterator); } |
应相当于:
1 2 3 4 5 | public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { List<Foo> fooList = new ArrayList<Foo>(); while(fooIterator.hasNext()) fooList.add(fooIterator.next()); } |
API中是否有实现这一点的方法,或者这是唯一的方法?
不,在标准API中没有类似的东西。
在Java中,使用EDOCX1 0作为API的一部分并不是惯用的(通常是不常见的);它们通常是产生和立即消耗的。
在番石榴(谷歌的新通用Java库,它取代谷歌的集合),这可能是简单的:
1 | return Lists.newArrayList(fooIterator); |
或者如果列表是只读的:
1 | return ImmutableList.copyOf(fooIterator); |
不,但是Google收藏库有一个很好的方法来实现这一点(如果你打算使用它的一些其他功能——没有理由仅仅为了这个而添加这种依赖关系):
1 | Iterators.addAll(targetCollection, sourceIterator); |
我不相信迭代器在固定的迭代次数之后会停止,所以这可能不是将数据插入列表的安全方法。考虑一个虚拟迭代器实现,它总是从对
在Java 8中,你可以这样做:
1 2 3 4 | public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { List<Foo> fooList = new ArrayList<Foo>(); fooIterator.forEachRemaining(fooList::add); } |
另请参见:将ITerable转换为集合的简单方法