按顺序延迟评估值

时间:2017-07-10 14:58:26

标签: scala

假设我有一堆惰性值:

lazy val v1: T = ... 
lazy val v2: T = ... 
lazy val v3: T = ... 

我有一个布尔函数,给出类型T的结果,检查它是否满足某个标准

def f(value: T): Boolean = { /* something here */ }

我希望以一种懒惰的方式找到满足某个标准的值:就像你在看到它们的时候继续评估它们,并在找到满足条件的第一个时立即停止评估: 我试过这个:

Iterable(v1, v2, v3).find(f)

但显然这会触发所有值v1v2v3(虽然我希望它们是懒惰的)。 有没有替代方案?

1 个答案:

答案 0 :(得分:5)

这是因为当你将lazy val传递给构造函数时,它们会被严格评估,除非构造函数本身是按名称传递

例如,cons的{​​{1}}符号(Stream的懒惰对应词)可以让您达到您想要的效果:

List

Here是关于懒惰和名字参数的有趣读物。