Ren*_*aud 349
更好地使用像Guava这样的库:
import com.google.common.collect.Lists;
Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);
Run Code Online (Sandbox Code Playgroud)
另一个番石榴的例子:
ImmutableList.copyOf(myIterator);
Run Code Online (Sandbox Code Playgroud)
import org.apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = ...//some iterator
List<Element> myList = IteratorUtils.toList(myIterator);
Run Code Online (Sandbox Code Playgroud)
Stu*_*rks 225
在Java 8中,您可以使用forEachRemaining已添加到Iterator界面的新方法:
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
Run Code Online (Sandbox Code Playgroud)
Ósc*_*pez 62
您可以将迭代器复制到新列表,如下所示:
Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
copy.add(iter.next());
Run Code Online (Sandbox Code Playgroud)
这是假设列表包含字符串.实际上没有一种更快的方法可以从迭代器重新创建列表,您可以手动遍历它并将每个元素复制到相应类型的新列表中.
编辑:
这是一种以类型安全的方式将迭代器复制到新列表的通用方法:
public static <T> List<T> copyIterator(Iterator<T> iter) {
List<T> copy = new ArrayList<T>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
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]
Run Code Online (Sandbox Code Playgroud)
Dub*_*zar 23
如果你有Iterable,那么使用Java 8你可以使用这个解决方案:
Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
据我所知Collectors.toList()创建ArrayList实例.
实际上在我看来,它在一行中看起来也不错.
例如,如果您需要List<Element>从某个方法返回:
return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
yeg*_*256 21
你也可以使用IteratorUtilsApache commons-collections,虽然它不支持泛型:
List list = IteratorUtils.toList(iterator);
Run Code Online (Sandbox Code Playgroud)
没有外部依赖,这里是使用 Streams 和 java 16 toList() 的单行代码。
给定一个Iterator<?> iterator:
List<?> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false).toList();
Run Code Online (Sandbox Code Playgroud)
使用普通Java 8的简洁解决方案java.util.stream:
public static <T> ArrayList<T> toArrayList(final Iterator<T> iterator) {
return StreamSupport
.stream(
Spliterators
.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(
Collectors.toCollection(ArrayList::new)
);
}
Run Code Online (Sandbox Code Playgroud)
小智 7
Iterator中的Java 8 forEachRemaining方法可以在这里使用:
List<Element> elementList = new ArrayList<>();
iterator.forEachRemaining(elementList::add);
Run Code Online (Sandbox Code Playgroud)
List result = new ArrayList();
while (i.hasNext()){
result.add(i.next());
}
Run Code Online (Sandbox Code Playgroud)