【发布时间】:2015-08-19 06:04:59
【问题描述】:
考虑以下列表转换:
List(1,2,3,4) map (_ + 10) filter (_ % 2 == 0) map (_ * 3)
通过以下方式评估:
List(1, 2, 3, 4) map (_ + 10) filter (_ % 2 == 0) map (_ * 3)
List(11, 12, 13, 14) filter (_ % 2 == 0) map (_ * 3)
List(12, 14) map (_ * 3)
List(36, 42)
所以有三遍,每一遍都会创建一个新的列表结构。
那么,第一个问题:Stream 可以帮助避免它吗?如果可以,如何避免?是否可以一次完成所有评估而不创建其他结构?
以下流评估模型是否正确:
Stream(1, ?) map (_ + 10) filter (_ % 2 == 0) map (_ * 3)
Stream(11, ?) filter (_ % 2 == 0) map (_ * 3)
// filter condition fail, evaluate the next element
Stream(2, ?) map (_ + 10) filter (_ % 2 == 0) map (_ * 3)
Stream(12, ?) filter (_ % 2 == 0) map (_ * 3)
Stream(12, ?) map (_ * 3)
Stream(36, ?)
// finish
如果是,则与List 的情况相同,创建的通道数和新Stream 结构的数量相同。如果不是——那么第二个问题:Stream尤其是这种转化链中的评估模型是什么?
【问题讨论】:
-
存在一个新的
Stream对象并不意味着整个集合都通过了。
标签: scala stream lazy-evaluation lazy-sequences