scala函数
Scala除了方法外,还支持函数,方法对对象进行操作,但是函数不是。
def func(n: String) = 表达式
如果函数体有多个表达式,则可以使用代码块,代码块的最后一个表达式的值就是 函数的返回值
def func(n: String) = { }
在函数中,并不需要 return来返回值,而且只要函数不是递归的,可以不用指定返回类型,如果是递归函数,则必须要指定返回类型
def fac(n: Int): Int = if (n<0) n=1 else n*fac(n-1)
默认参数
def decorate(str: String,left: String="[",right: String="]") = left + str + right
相对参数的个数不够,默认参数从后往前逐个应用进来
decorate("Hello",">>>[") // >>>[Hello]
带名参数
提供参数值的时候,可以执行参数名,指定参数名的时候,参数的顺序可以不和函数定义时的完全一致
decorate(left="<<<",str="hello",right=">>>")
变长参数
可以接受可变长度参数列表的函数
def sum(args: Int*) = { var result = 0 for(arg <- args) result+=arg result } val = sum(1,3,4,7,25) 函数得到是一个seq类型 如果有一个值序列,不能直接传入函数中 val = sum(1 to 5) //错误 如果sum传入单个参数,那么改参数必须要是单个整数,而不是整数区间,如果希望这个参数作为参数当做参数序列处理,需要加上 :_* val s = sum(1 to 5: _*)
过程
过程就是没有返回值的函数,函数体代码块前没有=,(认为返回值是 Unit类型)
def box(s: String){ var border = "-"*s.length() + "--\n" println(border + "|" + s + "|\n" + border) }
或者
def box(s: String): Unit = { var border = "-"*s.length() + "--\n" println(border + "|" + s + "|\n" + border) }
懒值
当val 被声明为lazy的时候,它的初始化将会被推迟,知道首次使用对它取值
lazy val words = scala.io.Source.fromFile("/opt/words").mkString
懒值可以认为是介于 val def 的中间状态
val words = scala.io.Source.fromFile("/opt/words").mkString //words被定义的时候被取值 lazy val words = scala.io.Source.fromFile("/opt/words").mkString //words首次被使用时被取值 def words = scala.io.Source.fromFile("/opt/words").mkString //words每次被使用的被取值
懒值并不是没有额外的开销,每次访问懒值,都会有一个方法被调用,这个方法以线程安全的方式检查该值是否被初始化。