【发布时间】:2016-07-24 07:32:45
【问题描述】:
我正在尝试创建对象的“惰性”映射(实际上,它们是演员,但我用一个更琐碎的例子来问我的问题)。
Scala 视图在某种意义上是惰性。但他们的懒惰实际上只是不严格。也就是说,这些值实际上是按名称调用的,也就是说,在需要时,通过调用 Function0(无参数函数)来评估这些值。 p>
我感兴趣的是一个惰性求值但只求值一次的集合。这是我正在寻找的东西:
val x = Map(1->2, 2->2).view
val y = x map {case (k,v) => (k,{println("Hello");v.toString})}
val z1 = y.find{case (k,_) => k==1}
val z2 = y.find{case (k,_) => k==1}
当我将它放入 Scala 工作表时,我得到的是:
x: scala.collection.IterableView[(Int, Int),scala.collection.immutable.Map[Int,Int]] = IterableView(...)
y: scala.collection.IterableView[(Int, String),Iterable[_]] = IterableViewM(...)
Hello
z1: Option[(Int, String)] = Some((1,1))
Hello
z2: Option[(Int, String)] = Some((1,1))
一切都应该如此。除了我不想看到第二个“你好”。换句话说,我只希望映射函数 (toString) 在需要时被调用一次。
有人对如何实现我的目标提出建议吗?这不是超级重要,但我很好奇它是否可以做到。
【问题讨论】:
-
z1和z2有什么区别? -
@rumoku 没有区别,他只是想记住 y 以便每个元素不会调用两次 map 函数
标签: scala lazy-evaluation