1.Scala函数的定义
- 有参函数
- 无参函数
def fun (a: Int , b: Int ) : Unit = { println(a+b) } fun(1,1) def fun1 (a : Int , b : Int)= a+b println(fun1(1,2))
注意点:
l 函数定义语法 用def来定义
l 可以定义传入的参数,要指定传入参数的类型
l 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候。
l scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回值。
l 如果返回值可以一行搞定,可以将{}省略不写
l 传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。
l 如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。
def max(x:Int,y:Int) = { if(x>y){ x }else{ y } } println(max(100,2)) def max(x:Int,y:Int) = if(x>y) x else y println(max(100,2))
2.递归函数
/** * 递归函数 * 5的阶乘 */ def fun2(num :Int) :Int= { if(num ==1) num else num * fun2(num-1) } print(fun2(5))
3.包含参数默认值的函数
l 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
l 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
/** * 包含默认参数值的函数 * 注意: * 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值 * 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称 */ def fun3(a :Int = 10,b:Int) = { println(a+b) } fun3(b=2)
4.可变参数个数的函数
l 多个参数用逗号分开
/** * 可变参数个数的函数 * 注意:多个参数逗号分开 */ def fun4(elements :Int*)={ var sum = 0; for(elem <- elements){ sum += elem } sum } println(fun4(1,2,3,4))
5.匿名函数
5.1 有参匿名函数
5.2 无参匿名函数
5.3 有返回值的匿名函数
可以将匿名函数返回给val定义的值
匿名函数不能显式声明函数的返回类型
/** * 匿名函数 * 1."=>"就是匿名函数 * 2.匿名函数调用要赋值给一个变量,调用直接调用这个变量就可以 * 3.匿名函数不能显式的写函数返回类型 */ //有参数匿名函数 val value1 = (a : Int) => { println(a) } value1(1) //无参数匿名函数 val value2 = ()=>{ println("我爱尚学堂") } value2() //有返回值的匿名函数 val value3 = (a:Int,b:Int) =>{ a+b } println(value3(4,4))
6. 嵌套函数
/** * 嵌套函数 * 例如:嵌套函数求5的阶乘 */ def fun5(num:Int)={ def fun6(a:Int,b:Int):Int={ if(a == 1){ b }else{ fun6(a-1,a*b) } } fun6(num,1) } println(fun5(5))
7. 偏应用函数
偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。
/** * 偏应用函数 */ 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")
8. 高阶函数
函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。
l 函数的参数是函数
l 函数的返回是函数
l 函数的参数和函数的返回是函数
/** * 高阶函数 * 函数的参数是函数 或者函数的返回是函数 或者函数的参数和返回都是函数 */ //函数的参数是函数 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))
9. 柯里化函数
l 可以理解为高阶函数的简化
/** * 柯里化函数 */ def fun7(a :Int,b:Int)(c:Int,d:Int) = { a+b+c+d } println(fun7(1,2)(3,4))