java - 将迭代器转换为列表会导致空列表
问题描述
我有相当于,从这里:
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
它说:
对每个剩余元素执行给定的操作,直到所有元素都已处理或该操作引发异常。如果指定了迭代顺序,则按迭代顺序执行操作。操作引发的异常将转发给调用者。
它看起来并没有从迭代器中删除任何东西,所以我不认为是这样。
解决方案
使用代码,看起来forEachRemaining
确实清空了流。没有那条线,流最终不会是空的。问题中的链接解释iterator
给出了这个默认实现:
while (hasNext())
action.accept(next());
这将清空迭代器。这与以下拆分器不同:
调用 tryAdvance(java.util.function.Consumer<? super T>)
不是next()
,但无论如何,你不能迭代两次。
推荐阅读
- pouchdb - pouch db中的数据安全机制
- java - 为什么 set.contains 不使用覆盖的 equals() 方法?
- c# - 获取 C# XML 节点的特定值
- vue.js - 如何创建不包含 App.vue 组件的登录屏幕
- javascript - 如何在 CI 中使用 JavaScript
- java - retrofit2.Call com.application.Example.Api.api_v2.BaseApiService.getUsermember(java.lang.String)' 在空对象引用上
- html - 在包含自定义组件的 Angular 页面中,我应该如何确保所有 ID 都是唯一的以消除警告?
- variables - cypress:then 块之外的变量范围。我面临问题
- java - 应用程序无法启动服务
- reactjs - React PropTypes:不同对象形状的数组