总结:scala的不愧是函数式编程语言
object TestFunction2 {
def main(args: Array[String]): Unit = {
/*
* 1.递归
* */
def fun1(i:Int):Int = {
if(i==1) return 1;
return i*fun1(i-1);
}
println(fun1(5))
/*
* 2.参数带默认值
* */
def fun2(i:Int=1,j:Int=2):Int = {
return i+j;
}
println(fun2())
println(fun2(10))
println(fun2(j=10))
/*
* 3、变长参数列表
* */
def fun3(s:String*)={
//for遍历
// for(item<-s){
// println(item);
// }
//lambda表达式 在scala中的体现
s.foreach(item=> println(item))
//在匿名函数内部只用了一次 可以用下划线代替
s.foreach(println(_))
//匿名函数只需要一个参数 而s的每一项都是一个 所以直接省略了
s.foreach(println)
}
fun3("1","2")
/*
* 4、匿名函数(lambda表达式)
* 下面的写法就类似于函数指针了 用的不多
* 主要还是用在匿名函数作为参数传递
* */
def fun4=(a:Int,b:Int)=>{
println(a+b);
}
fun4(3,4)
/*
* 5、嵌套函数
* */
def fun5(a:Int):Int={
def fun6(b:Int):Int={
if(b==1) return 1;
return b*fun6(b-1);
}
fun6(a)
}
println(fun5(5))
/*
* 6、偏应用函数
* 某些场景下 函数要被调用多次 只有少部分参数在变化其他参数都不变可以用偏应用函数
* */
def fun6(date:Date,str:String): Unit ={
println(s"date is $date,str is $str")
}
//传统方式
val date = new Date()
fun6(date,"a")
fun6(date,"b")
fun6(date,"c")
//偏应用函数
def fun66=fun6(date,_:String)
fun66("aa");
fun66("bb");
fun66("cc");
/*
* 7、高阶函数
* 方法的参数是函数
* 方法的返回是函数 返回值手动写 或者在返回值后面加上_
* 方法的参数和返回都是函数 就是前两者的结合
* */
//方法的参数是函数
def fun71(f:(Int,Int)=>Int,str:String)={
println(f(100,200)+str)
}
fun71((a,b)=>a*b,"aa")
//方法的返回是函数
// 一种是直接把返回值类型写好
def fun72(s:String):(String,String)=>String={
def fun73(a:String,b:String):String={
return a+b+s
}
fun73
}
//不写明返回值 自动推断 但是需要加上 _
def fun74(s:String)={
def fun73(a:String,b:String):String={
return a+b+s
}
fun73 _
}
println(fun72("a")("b","ll"))
println(fun74("a")("b","ll"))
/*
* 柯里化函数 简化第二种高阶函数
* */
def fun8(a:Int,b:Int)(c:Int)={
a+b+c
}
println(fun8(1,2)(3))
}
}