代码之家  ›  专栏  ›  技术社区  ›  Daniel

顺序值的延迟评估

  •  1
  • Daniel  · 技术社区  · 9 年前

    假设我有一堆懒惰的价值观:

    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)
    

    但显然这会引发所有的价值观 v1 v2 , v3 有什么替代方案吗?

    1 回复  |  直到 9 年前
        1
  •  5
  •   stefanobaghino    9 年前

    这是因为当你通过 lazy val 对于构造函数来说,它们是严格评估的,除非构造函数本身是 按名称传递

    例如 cons 符号 Stream List )允许您实现您想要的:

    lazy val v1 = { print("v1 "); 1 }
    lazy val v2 = { print("v2 "); 2 }
    lazy val v3 = { print("v3 "); 3 }
    
    (v1 #:: v2 #:: v3 #:: Stream.empty).
      find(_ == 2).
      foreach(println) // prints "v1 v2 2"
    

    Here

    推荐文章