给定Iterator<Element>,我们如何方便地将该迭代器转换为List<Element>,以便我们可以对其使用List的操作,如get(index), add(Element)等。
当前回答
最好使用像Guava这样的库:
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
另一个番石榴的例子:
ImmutableList.copyOf(myIterator);
或Apache Commons Collections:
import org.apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = ...//some iterator
List<Element> myList = IteratorUtils.toList(myIterator);
其他回答
最好使用像Guava这样的库:
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
另一个番石榴的例子:
ImmutableList.copyOf(myIterator);
或Apache Commons Collections:
import org.apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = ...//some iterator
List<Element> myList = IteratorUtils.toList(myIterator);
试试Cactoos的StickyList:
List<String> list = new StickyList<>(iterable);
免责声明:我是开发者之一。
我只是想指出一个看似显而易见但行不通的解决方案:
List list = Stream.generate(iterator::next) .collect(Collectors.toList());
这是因为Stream#generate(Supplier<T>)只能创建无限的流,它并不期望它的参数抛出NoSuchElementException(这就是Iterator#next()最终会做的事情)。
如果你选择迭代器→流→列表的方式,应该使用xehpuk的答案。
在Java 8中,你可以使用添加到Iterator接口的新的forEachRemaining方法:
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
使用Java .util.stream的纯Java 8非常简洁的解决方案:
public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
return StreamSupport
.stream(
Spliterators
.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(
Collectors.toCollection(ArrayList::new)
);
}
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 为什么元组可以包含可变项?
- 在Jar文件中运行类
- 带参数的可运行?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作