似乎Iterator和Stream都是懒惰的,并且允许你继续返回元素到你心中的内容。两者有什么区别?Scala中迭代器和流之间的区别?
50
A
回答
42
流memoises和Iterator没有。您可以多次遍历相同的流并每次都得到相同的结果。另一方面,迭代器只能被遍历一次。
18
它们都是用于访问当前元素的构造,具有尚未知的其余元素列表(懒惰尾部)。
Iterator
是一个势在必行的构造,你只能遍历一次。
Stream
是一个功能性构造。从理论上讲,你可以多次遍历它(和其他人提到的一样,它不会重新计算已经计算好的部分),但是在实践中,因为Streams是无限的或者非常大的(这就是为什么你首先使用它)参考完整的流并没有多大意义(你会遇到Out Of Memory非常容易)。
- 因此,你应该总是定义使用
def
流,从来没有把它变成具有长寿命范围的局部变量。 - 也有使用流编写递归函数时微妙之处,
- 可以有一个事实,即Scala的
Stream
不在其头部懒惰导致一些意外的行为,像
一般是比较安全的心灵避免使用普通的Stream
s。替代品使用Scalaz的EphemeralStream
,它使用弱引用自动忽略未引用的部分,或使用Iteratees(另请参阅here)或something similiar。
+0
我很好奇:为什么EphemeralStream不是默认实现?您始终可以从数据沿袭(其功能语言)重建被遗忘的部分。这听起来像是一个很大的设计缺陷。 – tribbloid 2017-05-08 22:01:05
相关问题
- 1. 输入迭代器和只读前向迭代器之间有什么区别?
- 2. Java:迭代器和阵列列表之间的区别
- 3. Java枚举和迭代器之间的区别
- 4. scala和java枚举之间的区别
- 5. 方法迭代器和视图之间有什么区别?
- 6. smarty中的foreach和迭代之间的区别
- 7. JavaScript中循环的迭代器和生成器之间的区别
- 8. 迭代行与while和数组赋值之间的区别
- 9. 索引和迭代器的区别是?
- 10. 协议和代表之间的区别?
- 11. $ HOME和'〜'(代字号)之间的区别?
- 12. http_proxy,https_proxy和代理之间的区别?
- 13. Scala中的RegexpParsers,StandardTokenParsers和JavaTokenParsers之间的区别
- 14. Scala迭代器/流与已知大小
- 15. Boost单通迭代器和前向遍历迭代器之间有什么区别?
- 16. 在Scala中,乐趣_和乐趣之间的区别是什么
- 17. Scala中f(a,b)和f(a)(b)之间的区别
- 18. Scala中的JsObject和JsValue之间有什么区别?
- 19. 集合和容器之间的区别
- 20. 监视器和锁之间的区别?
- 21. 'int'对象不可迭代和两个代码之间的区别?
- 22. 二叉搜索树插入中迭代和递归之间的区别
- 23. Java:流和I/O流之间的区别解释
- 24. '+ ='和'= +'之间的区别?
- 25. {!!之间的区别!!}和{{}}
- 26. ==和case之间的区别?
- 27. '#','%'和'$'之间的区别
- 28. | =和^ = css之间的区别
- 29. “%〜dp0”和“。\”之间的区别?
- 30. .eq之间的区别。和==
关于记忆 - 如果我访问第N个元素,是访问时间O(1)还是O(N)? – ryeguy 2009-10-07 04:14:20
@ryeguy这是O(n),因为Stream构建了一个链接列表来缓存元素值。 – 2009-10-07 04:44:08
好的,Stream和Iterable之间有什么区别呢? – 2011-05-30 22:30:48