首页 > 解决方案 > 将迭代器转换为列表会导致空列表

问题描述

我有相当于,从这里

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
sourceIterator.forEachRemaining(source -> System.out.println(source)); // prints out all elements
Iterable<String> iterable = () -> sourceIterator;
List<String> targetList = StreamSupport.stream(iterable.spliterator(), false).
    .collect(Collectors.toList());
System.out.println(targetList.isEmpty()) // prints true

在我想出进行转换的方法之前,我已经添加了一些调试打印语句来帮助我。但事实证明,流是空的。所以我想知道我的内容或我的方法是否不太正确?

阅读forEachRemaining它说:

对每个剩余元素执行给定的操作,直到所有元素都已处理或该操作引发异常。如果指定了迭代顺序,则按迭代顺序执行操作。操作引发的异常将转发给调用者。

它看起来并没有从迭代器中删除任何东西,所以我不认为是这样。

标签: javajava-streamspliterator

解决方案


使用代码,看起来forEachRemaining确实清空了流。没有那条线,流最终不会是空的。问题中的链接解释iterator给出了这个默认实现:

while (hasNext())
    action.accept(next());

这将清空迭代器。这与以下拆分器不同:

调用 tryAdvance(java.util.function.Consumer<? super T>)

不是next(),但无论如何,你不能迭代两次。


推荐阅读