Scala def和val比较

Scala 提供了四种变量定义的方式:defvallazy valvar。def定义的变量像是“占位符”,变量定义并不会执行,在每次调用变量的时候会执行;而val变量在定义的时候就会执行,且只执行一次;lazy val和val一样只会执行一次,但它是在使用的时候执行,不是在定义的时候。前面的def,(lazy) val用于定义不可变量,而var用于定义可变量,除此之外它和val一样的,所以下面demo不对var做演示。

一般情况下,def用于定义方法,val用于定义不可变量,var用于定义变量

先看一个简单的例子,它用于生成时间戳,他们分别使用val,def和lazy val定义。

从运行结果可以看出,val定义的timestamp1在定义的时候就被执行,且使用timestamp1定义的List中每个元素值是一样的。def定义的timestamp2在定义的时候并没有执行(因为没有执行println),然而在使用timestamp2定义的List中每个元素值是连续的三个值(因为线程sleep了1毫秒),且打印出现了三次,说明定义被执行了三次。对比前两个,lazy val定义的变量timestamp3并没有直接执行,而是在定义List的时候才执行,并且只执行了一次,这说明lazy val还是val,只是“聪明的“等到使用的时候才执行。

下面再看一个例子,isDivisibleBy用于生成一个函数(Int=>Boolean),它表示某数字是否可以被整除。

从代码执行结果可以看出,isEven1在定义的时候isDivisibleBy方法就执行了,所以isEven1的调用就等价于i%k==0,而isEven2在每次执行的时候才会调用isDivisibleBy方法(从println执行可以看出),所以isEven2的调用就等于isDivisibleBy(k)(i)。

def和val的概念在scala中很重要,它是理解方法和函数,值参数和名参数的基础,后面会有介绍。

Scala def和val比较