函数是Scala的核心
def 函数名([参数列表]):[返回值]={
函数体
return [表达式]
}
列1:
def square(x: Int): Int = {
println(x)
x * x //return
}
列2:
def sayHello(x:String):Unit={
println("Hello ! "+x)
}
函数调用
square(10)
sayHello("Scala")
传值调用时,参数只在调用时计算一次,后续重复使用计算的结果
def square(x: Int): Int = {
println(x) //3
x * x //计算3*3
}
square(1+2) //先计算1+2
传名调用时,参数在调用时不会计算,只有真正用到参数时才计算
def square(x: => Int): Int = {
println(x) //计算1+2
x * x //计算(1+2)*(1+2)
}
square(1+2) //调用时不计算
指不含函数名称的函数
匿名函数定义
“=>”左边为参数列表,右边为函数体
(参数列表)=>{函数体}
如果函数体包括多条语句,应使用“{}”包含
(x:Int)=>x*x
(x:Int)=>{println(x);x*x}
() => { System.getProperty("user.dir") }
val f1=(x:Int)=>{println(x);x*x}
f1(2)
高阶函数可以将其他函数作为参数或者使用函数作为输出结果
//函数作为参数
def doSquare(f:Int=>Int,p:Int)=f(p)
def square(x:Int):Int=x*x
doSquare(square,square(2))
//函数作为返回值
//返回类型为函数(Int=>Int)
def doSquare()={
(x:Int)=>x*x
}
doSquare()(2)
Scala函数内可以定义函数,函数内的函数也称局部函数或者内嵌函数
//使用函数嵌套实现阶乘运算
def factorial(i: Int): Int = {
def fact(i: Int, accumulator: Int): Int = {
if (i <= 1)
accumulator
else
fact(i - 1, i * accumulator)
}
fact(i, 1) //不能在factorial()之外调用
}
方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化
柯里化指将原来接受两个参数的函数变成新的接受一个参数的函数的过程
def modN(n: Int,x: Int) = ((x % n) == 0)
//柯里化
def modN(n: Int)(x: Int) = ((x % n) == 0)
def f1(n: Int, x: Int) = modN(n)(x)
//新函数接收剩余的参数列表作为其参数
def f2(x: Int) = modN(10)(x)
def f3(n: Int) = modN(n)(10)
def f4 = modN(10)(_)
方法可以具有隐式参数列表,由参数列表开头的implicit 关键字标记
Scala可自动传递正确类型的隐式值
def sum(x:Int)(implicit y:Int)=x+y
implicit var a=10 //将作为Int类型隐式值自动传递
sum(10) //20
通常情况下,传入参数与函数定义的参数列表一一对应
命名参数允许使用任意顺序传入参数
def printName(first:String, last:String) = {
println(first + " " + last)
}
//Prints "John Smith"
printName("John","Smith")
printName(first = "John",last = "Smith")
printName(last = "Smith",first = "John")
Scala函数允许指定参数的缺省值,从而允许在调用函数时不指明该参数
def printName(first:String="John", last:String="Smith") = {
println(first + " " + last)
}
//Prints "John Smith"
printName()