在Scala中使用惰性val(或val)函数

时间:2014-08-13 15:06:05

标签: scala lazy-evaluation

我看过很多关于val,lazy val和def之间区别的话题,但是没有一个能回答我的问题。

我想知道当val是函数时val(或lazy val)和def之间有什么区别。实际上,我读到的大多数答案都解释了val只被评估一次,而每次调用时都会评估def。我没有得到的是当使用val时,如下面的代码:

lazy val name : Int => Int = {
  case n if(n < 20) => //terminal case... 
  case n if(n < 100) => //terminal case...
  case n if(n < 1000) => name(n / 100) + //something unrelevant...
}
val result = (1 to 1000).map(name).sum

为了评估结果,在我看来,对于序列1到1000的每个元素,名称将被“评估”。与在特定情况下使用def 有什么不同?

1 个答案:

答案 0 :(得分:2)

  

为了评估结果,在我看来,名字将是   “评估”序列1到1000的每个元素。

事实并非如此。 lazy val表示在第一次调用它之前,不会评估name。在第一次调用之后,它将评估其定义并完全定义,然后其他调用使用已定义的函数。

您绝对可以使用name定义您的函数def,它将是相同的。

基本上valdef是相同的,使用lazy val只需将您的函数的完整评估推迟到第一次调用。