注意点:
方法定义语法 用 def 来定义可以定义传入的参数,要指定传入参数的类型方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归方法中或者方法的返回值是函数类型的时候。scala 中方法有返回值时,可以写 return,也可以不写 return,会把方法中最后一行当做结果返回。当写 return 时,必须要写方法的返回值。如果返回值可以一行搞定,可以将{}省略不写传递给方法的参数可以在方法中使用,并且 scala 规定方法的传过来的参数为val 的,不是 var 的。如果去掉方法体前面的等号,那么这个方法返回类型必定是 Unit 的。这种说法无论方法体里面什么逻辑都成立,scala 可以把任意类型转换为 Unit.假设,里面的逻辑最后返回了一个 string,那么这个返回值会被转换成 Unit,并且值会被丢弃。偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。
/** * 偏应用函数 */ def log(date :Date, s :String)= { println("date is "+ date +",log is "+ s) } val date = new Date() log(date ,"log1") log(date ,"log2") log(date ,"log3") //想要调用 log,以上变化的是第二个参数,可以用偏应用函数处理,这里_需要指定类型。 val logWithDate = log(date,_:String) logWithDate("log11") logWithDate("log22") logWithDate("log33")函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。
函数的参数是函数函数的返回是函数函数的参数和函数的返回是函数 /** * 高阶函数 * 函数的参数是函数 或者函数的返回是函数 或者函数的参数和返回都是函数 */ //函数的参数是函数 def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = { f(a,100) } def f(v1 :Int,v2: Int):Int = { v1+v2 } println(hightFun(f, 1)) //函数的返回是函数 //1,2,3,4 相加 def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = { def f2 (v1: Int,v2:Int) :Int = { v1+v2+a+b } f2 } println(hightFun2(1,2)(3,4)) //函数的参数是函数,函数的返回是函数 def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = { f } println(hightFun3(f)(100,200)) println(hightFun3((a,b) =>{a+b})(200,200)) //以上这句话还可以写成这样 //如果函数的参数在方法体中只使用了一次 那么可以写成_表示 println(hightFun3(_+_)(200,200))