与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
上阅读时说:
对每个剩余元素执行给定的操作,直到所有元素都已处理或该操作引发异常。如果指定了顺序,则按照迭代顺序执行操作。该操作引发的异常会中继到调用方。
它看起来并没有从迭代器中删除任何内容,所以我认为不是那样。
答案 0 :(得分:2)
使用代码,看起来forEachRemaining
确实清空了流。没有该行,流将不会最终为空。问题中iterator
的链接说明提供了以下默认实现:
while (hasNext())
action.accept(next());
这将清空迭代器。这与spliterator相同,
调用tryAdvance(java.util.function.Consumer <?super T>)
不是next()
,但是无论如何,您不能重复两次。