给定Iterator<Element>,我们如何方便地将该迭代器转换为List<Element>,以便我们可以对其使用List的操作,如get(index), add(Element)等。


当前回答

试试Cactoos的StickyList:

List<String> list = new StickyList<>(iterable);

免责声明:我是开发者之一。

其他回答

在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)
    );
}

注意Iterable和Iterator之间是有区别的。

如果你有一个Iterable,那么在Java 8中你可以使用这个解决方案:

Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
    .stream(iterable.spliterator(), false)
    .collect(Collectors.toList());

据我所知,collections . tolist()创建ArrayList实例。

其实在我看来,它在一行里也很好看。 例如,如果你需要从某个方法返回List<Element>:

return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
List result = new ArrayList();
while (i.hasNext()){
    result.add(i.next());
}

试试Cactoos的StickyList:

List<String> list = new StickyList<>(iterable);

免责声明:我是开发者之一。