普通函数
基本语法
def 函数名(参数列表):返回值类型={
方法体
}
返回值类型可以不写,使用类型推断,方法体中可执行的最后一行的类型会被自动作为返回值类型
当注明了返回值类型,函数最后一行就必须是对应类型的数值
无返回值使用Unit
案例:输入若干整型数值,求最大值
/*
1、要求至少传入两个数值才可以比较大小,所以预定义两个确定的形参,剩余部分使用可变参数接收
2、当可变参数个数为0时,对其求最大值会出现空集异常,所以需要判断集合大小
*/
def getMax(n1: Int, n2: Int, others: Int*): Int = {
var otherMax = Int.MinValue
if (others.length != 0) {
otherMax = others.reduce((n1, n2) => if (n1 > n2) n1 else n2)
}
if (n1 > n2 && n1 > otherMax) n1 else if (n2 > otherMax) n2 else otherMax
}
println(getMax(1, 2))
println(getMax(1, 2, 0))
println(getMax(1, 2, 3, 6))
高阶函数
在scala中,函数是可以被赋值给一个变量的,同时也可以作为另一个函数的参数,这种需要接收一个函数作为参数的函数叫做高阶函数
函数类型声明方式:(参数一数据类型,参数二数据类型,......)=>返回值类型
这里的返回值类型也可以是函数
例如:val fun: (String, Int) => String = (str: String, n: Int) => str * n
案例:传入一个字符串,将字符串的每个字符对照ASCII码转换为数字,再将数字拼接起来
def funTest(f: (String, String) => String, mes: String): String = {
mes.map(_.toInt.toString).reduce(f)
}
println(funTest(_ + _, "Aa"))
同时,函数也可以作为另一个函数的返回值
需求:函数传入一个偶数时,返回一个两数相加求和的函数,传入一个奇数时,返回一个两数相减求差的函数
def cal(n: Int): (Int, Int) => Int = {
if (n % 2 == 0) _ + _ else _ - _
}
println(cal(9)(5, 3))
println(cal(14)(2, 5))
这里的cal(9)
返回了一个两数求差的函数,cal(9)(5,3)
相当于将5,3作为参数传入了一个两数求差的函数中