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每次被使用的被取值

懒值并不是没有额外的开销,每次访问懒值,都会有一个方法被调用,这个方法以线程安全的方式检查该值是否被初始化。

posted @ 2018-10-15 14:47  v-imok  阅读(145)  评论(0编辑  收藏  举报