将迭代器转换为列表会导致列表为空

时间:2020-07-08 10:42:53

标签: java java-stream spliterator

here中的等价于我:

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上阅读时说:

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

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

1 个答案:

答案 0 :(得分:2)

使用代码,看起来forEachRemaining确实清空了流。没有该行,流将不会最终为空。问题中iterator的链接说明提供了以下默认实现:

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

这将清空迭代器。这与spliterator相同,

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

不是next(),但是无论如何,您不能重复两次。