函数是Scala的核心
函数定义 //省略返回值则成为过程 def 函数名([参数列表]):[返回值]={函数体 return [表达式]} 函数调用 函数名(参数列表) //函数的定义和使用 def min(a:Int,b:Int)= if (a>b) b else a println(min(10, 20)) //通过参数进行运算 def fun(a:Int,b:Int,c:String)= if (c.equals("+")) a+b else if(c.equals("-")) a-b else if(c.equals("*")) a*b else a/b println(fun(20,10,"/")) //通过指定参数名字,传递参数值 def showMsg(name:String,age:Int) ={ println("hello,l'm:"+name,age+"old") } showMsg("zhanghao",18) showMsg(age=18,name="zhanghao") //参数的长度为止,通过*来表示,可以传入多个参数 def showMsg2(name:String,s:String*) ={ println(name) for(str <- s) { println(str) } } showMsg("XXX","XX","X") 命名参数 通常情况下,传入参数与函数定义的参数列表一一对应 命名参数允许使用任意顺序传入参数指不含函数名称的函数 匿名函数定义: => 的左边为参数列表 => 的右边为函数体 如果函数体包括多条语句,应使用"{}"包含
(a:Int) => x*x (a:Int) => {println(x);x*x} //多条语句使用 {} val f1=(a:Int) => {println(a);a*a} println(f1(2)) val f2=f1 println(f2(2)) // 输出结果同f1一样都是4 val sum:(Int,Int) => Int = (a:Int,b:Int) => a+b println(sum(1,3)) //简化版 val sum:(Int,Int)=>Int=(_+_)案例:输入一个数字,能被3整除则两数相加,>=5000输出“恭喜xxx工资已超过30%的人”<5000则输出"抱歉xxx您仍需继续努力",不能被三整除则两数相减,0>&<=3000则输出“xxx,您是一个节约的人” >3000则输出“xxx,您应当养成节约的良好习惯”
def getFunByNum(num:Int):(Int,Int)=>String=>Unit={ if(num%3==0){ def add(a:Int,b:Int):(String)=>Unit= { if (a + b >= 5000) { def show(name: String) = { println("恭喜," + name + "工资超过30%的人") } show } else { def show(name: String) = { println("抱歉," + name + "您仍需继续努力") } show } } add }else{ def sub(a:Int,b:Int):String=>Unit={ if(a-b<=3000&&a-b>0){ def show(name:String)={ println(name+",您是一个节约的人") } show }else if(a-b>3000){ def show(name:String): Unit ={ println(name+"您应当养成节约的良好习惯") } show }else{ def show(name:String)={ println(name+",您的输入不合法") } show } } sub } } getFunByNum(31)(5000,2000)("张三")案例:函数作为参数传入Str返回Int,如果能被3整除两数相加,不能则两数相减
def fun(f:(String)=>Int,str:String):(Int,Int)=>Int={ var num=f(str) if(num%3==0){ (a:Int,b:Int) => a+b }else{ (a:Int,b:Int) => a-b } } val res = fun((s:String) => {if(s.equals("上海")) 3 else 1},"上海")(30,20) println(res) //50