给定Iterator<Element>,我们如何方便地将该迭代器转换为List<Element>,以便我们可以对其使用List的操作,如get(index), add(Element)等。
当前回答
你也可以使用来自Apache common -collections的IteratorUtils,尽管它不支持泛型:
List list = IteratorUtils.toList(iterator);
其他回答
使用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)
);
}
你可以像这样复制一个迭代器到一个新列表:
Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
copy.add(iter.next());
这是假设列表中包含字符串。实际上没有更快的方法从迭代器中重新创建列表,您只能手动遍历它,并将每个元素复制到合适类型的新列表中。
编辑:
下面是一个以类型安全的方式将迭代器复制到新列表的泛型方法:
public static <T> List<T> copyIterator(Iterator<T> iter) {
List<T> copy = new ArrayList<T>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
像这样使用它:
List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);
System.out.println(copy);
> [1, 2, 3]
在没有外部依赖的情况下,这里有一个使用Streams和java 16 toList()的一行程序。
给定迭代器<?>迭代器:
List<?> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false).toList();
你也可以使用来自Apache common -collections的IteratorUtils,尽管它不支持泛型:
List list = IteratorUtils.toList(iterator);
用谷歌番石榴!
Iterable<String> fieldsIterable = ...
List<String> fields = Lists.newArrayList(fieldsIterable);
++