一、Scala函数
函数是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=(_+_)
三、函数作为参数进行传递
def fun(a:Int,b:Int) = a+b
def fun1(a:Int,b:Int) = a-b
def fun2(a:Int,b:Int) = a*b
def funTest(f:(Int,Int) => Int,s:String) ={
val res=f(100,200)
s+res
}
println(funTest("总分",fun))
println(funTest((a:Int,b:Int) => 2*a+3*b,"abc="))
案例:输入一个数字,能被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)("张三")
四、函数作为返回值
def funTest2():(String,String) => String ={
def fun(str1:String,str2:String):String={
str1+"##"+str2+"$$"
}
fun
}
println((funTest2()("aa", "bb")))
五、函数作为参数和返回值
案例:函数作为参数传入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