函数声明
def funtionName([参数列表]):[return type]
标准函数
def sum01(x:Int,y:Int):Int={
return x+y
}
//可以尝试省略返回值类型
def sum02(x:Int,y:Int)={
x+y
}
可以省略return关键字以及返回值类型,系统一般可以自动推断。将代码块最后一行作为返回值。
可变长参数
def sum03(x:Int*)={
var res=0
for(i <- x){
res += i
}
res
}
def sum03(x:Int*)={
x.sum
}
注意:可变长参数必须放置在最后
命名参数
def main(args: Array[String]): Unit = {
//print("hello!\n" * 10)
saySomething(name="zhangsan",welcome = "welcome")
}
def saySomething(welcome:String,name:String): Unit ={
println(welcome+" ! "+name)
}
可以不按照函数中参数的顺序
参数默认值
def main(args: Array[String]): Unit = {
sayHello("ww")
sayHello()
}
def sayHello(name:String="zhangsan")={
println(s"hi~~ $name")
}
内嵌函数
def factorial(x:Int):Int={
def mulit(i:Int):Int={
if(x>0){
x*mulit(x-1)
}else{
1
}
}
mulit(x)
}
柯里化(Currying)
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接收一个单一参数的函数,并且返回新的函数的技术。
def sum01(x:Int,y:Int):Int={
return x+y
}
def sumCurrying(x:Int)(y:Int):Int={
x+y
}
scala> def sumCurrying(x:Int)(y:Int):Int={
| x+y
| }
sumCurrying: (x: Int)(y: Int)Int
scala> sumCurrying(2)(3)
res0: Int = 5
scala> var s=sumCurrying(1)(_)
s: Int => Int = <function1>
scala> s(2)
res4: Int = 3
scala> var s2=sumCurrying _
s2: Int => (Int => Int) = <function1>
scala> s2(2)(3)
res5: Int = 5
匿名函数|方法
只有参数列表和返回值类型,没有方法名,通常使用匿名函数形式去声明一个函数式变量 。 表面是变量,实质上还是函数。可以实现数据不动,代码动。
scala> var sum=(x:Int,y:Int)=>(x+y)
sum: (Int, Int) => Int = <function2>
scala> var mutil=(x:Int,y:Int)=>(x*y)
mutil: (Int, Int) => Int = <function2>
scala> println(sum(1,2)+"|"+mutil(1,2))
3|2
def关键字可以定义一个函数式变量。也可以声明一个标准方法。
def sum = (x:Int,y:Int)=>x+y
var sum=(x:Int,y:Int)=>x+y
var sum:(Int,Int)=(x:Int,y:Int)=>x+y
var sum = ((x,y)=>x+y):(Int,Int)=>Int
通过上述变换可以推导出函数可以变换为变量,因此可以使用var或者val修饰函数式变量,函数式变量是函数,所以可以用del修饰。
def method(op:(Int,Int)=>Int)(x:Int,y:Int)={
op(x,y)
}
val result01 = method((x,y)=>x+y)(1,2)
val result02 = method((x,y)=>x*y)(1,2)
scala> def method(x:Int,y:Int,f:(Int,Int)=>Int):Int={
| f(x,y)
| }
method: (x: Int, y: Int, f: (Int, Int) => Int)Int
scala> var f=(x:Int,y:Int)=>(x+y)
f: (Int, Int) => Int = <function2>
scala> method(2,3,f)
res17: Int = 5
scala> var f=(x:Int,y:Int)=>(x*y)
f: (Int, Int) => Int = <function2>
scala> method(2,3,f)
res18: Int = 6
scala> var r=method(2,3,_:(Int,Int)=>Int)
r: ((Int, Int) => Int) => Int = <function1>
scala> r((x,y)=>x+y)
res20: Int = 5
def method(name:String,x:Int,y:Int,f:(String,Int,Int)=>String):String={
| f(name,x,y)
| }
scala> var f=(name:String,x:Int,y:Int)=>name+x+y
f: (String, Int, Int) => String = <function3>
scala> method("zhangsan",3,4,f)
res25: String = zhangsan34
scala> def method(name:String="lisi",x:Int,y:Int,f:(String,Int,Int)=>String):String={
| f(name,x,y)
| }
method: (name: String, x: Int, y: Int, f: (String, Int, Int) => String)String
scala> method("zhangsan",3,4,f)
res26: String = zhangsan34