函数是一组一起执行一个任务的语句。
函数的声明:如果你不写等于号和方法主体,那么方法会被隐式声明为”抽象(abstract)”,包含它的类型于是也是一个抽象类型。
def functionName ([参数列表]) : [return type]
函数的使用:传名函数
//通过指定函数参数名,并且不需要按照顺序向函数传递参数
divided(b = 2, a = 4) //result 2
def divided(a: Int, b: Int) {
println(a + "除以" + b + "=" + a / b)
}
结果:4除以2=2
可变参数的函数
//可变参数 参数的类型之后放一个星号来设置可变参数(可重复的参数)
def variableParam(x: Int, strs: String*) {
println("可变参数长度:" + strs.length)
var i = 0;
for (arg <- strs) {
println("arg[" + i + "]=" + arg)
i += 1
}
}
variableParam(1, "vivo", "oppo", "huawei", "apple", "lenovo")
结果
可变参数长度:5
arg[0]=vivo
arg[1]=oppo
arg[2]=huawei
arg[3]=apple
arg[4]=lenovo
递归函数:
def actorial(x: Int): Int = {
if (x <= 1) {
1
} else {
x * actorial(x - 1)
}
}
val result = actorial(5)
println("5的阶乘是" + result)
结果:5的阶乘是120
默认参数值
//Scala 可以为函数参数指定默认参数值,使用了默认参数,你在调用函数的过程中可以不需要传递参数,
//这时函数就会调用它的默认参数值,如果传递了参数,则传递值会取代默认值。
def defaultParam(x: Int = 5, y: Int = 4) {
println(x + "*" + y + "=" + x * y)
}
defaultParam(3, 5) //带参数调用
defaultParam() //不带参数调用
结果:
3*5=15
5*4=20
传名调用
def callByName(arg: => String) {
println("callByName,调用了")
println("callByName,调用了,参数是" + arg)
}
def innerFun(): String = {
println("innerFun调用了")
"hello scala"
}
callByName(innerFun())
结果
callByName,调用了
innerFun调用了
callByName,调用了,参数是hello scala
// 高阶函数(Higher-Order Function)就是操作其他函数的函数。
//Scala 中允许使用高阶函数, 高阶函数可以使用其他函数作为参数,或者使用函数作为输出结果
def fun1(fu: Int => String, arg: Int) = fu(arg)
def intRide2ToString(arg: Int): String =arg+ "*2="+ (arg * 2)
println( fun1(intRide2ToString,10))
结果:10*2=20
函数嵌套
def nestFun(x : Int):Int={
def innerFun(x:Int,y:Int):Int = {
val result = x*y
result
}
innerFun(x,2)
}
println(nestFun(6))
结果:12
匿名函数:Scala 中定义匿名函数的语法很简单,箭头左边是参数列表, 右边是函数体,参数的类型是可省略的,Scala 的类型推测系统会推测出参数
var userDir = ()=>{System.getProperty("user.dir")} //不带参数的匿名函数
var sum = (x:Int,y:Int)=>{x+y}
println(userDir)
var sumResult = sum(1,2)
println(sumResult)
结果:3
偏应用函数:
Scala 偏应用函数是一种表达式,你不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。使用偏应用函数优化以上方法,绑定第一个参数,第二个参数使用下划线(_)替换缺失的参数列表,并把这个新的函数值的索引的赋给变量
def sumFun(x:Int,y:Int):Int = {
x*y
}
var x = 2
var sumFunResult = sumFun(x,_ :Int)
println(sumFunResult(5))
结果:10
柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
def strcat(s1: String)(s2: String) = {
s1 + "\t"+s2
}
var s1 = "hello"
var s2 = "scala"
println(strcat(s1)(s2))
结果:hello scala