学好Scala的开山之作-函数篇(2)

it2024-08-07  40

目录

1.隐式参数2.隐式函数(隐式转换)3.柯里化4.模式匹配5.样例化6.嵌套函数

1.隐式参数

方法可以具有隐式参数列表,由参数列表开头的implicit 关键字标记

mplict只能修改最尾部的参数列表,应用于其全部参数Scala可自动传递正确类型的隐式值通常与柯里化函数结合使用 //定义一个隐士参数 implicit var a: Int = 10 //将作为Int类型隐式值自动传递 def sum(x: Int)(implicit y: Int): Int = (x + y) println(sum(20)) 输出结果为20+10=30

注意返回结果的优先级:传参 > 隐式参数 > 默认

2.隐式函数(隐式转换)

隐式函数也称隐式转换,使用implicit修饰的函数

类型转换 double类型强转换为int类型 类型增强

3.柯里化

方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化 详情见列题:

//函数柯里化 def fun1(a:Int,b:Int,c:Int,d:Int):Int={//单参数列表 a+b+c+d } def fun2(a:Int,b:Int)(c:Int,d:Int):Int={//多参数列表 a+b+c+d } def fun3(a:Int)(b:Int)(c:Int)(d:Int):Int={ a+b+c+d } def fun4(a:Int)(b:Int,c:Int,d:Int):Int={ a+b+c+d } println(fun1(1,2,3,4)) println(fun2(1,2)(3,4)) println(fun3(1)(2)(3)(4)) println(fun4(1)(2,3,4))//如上都是柯里化

4.模式匹配

关键字是match 和 case, 如下例题展示用法:

5.样例化

//样例类(不需要New) case class Teacher(name:String,age:Int) def match4(teacher:Teacher):Unit=teacher match { case Teacher("gree", 19) => println("hello gree") case Teacher("wenwen", 21) => println("hello wenwen") case x: Teacher => {println("hello" + x.name)} } val t=Teacher("gree",19) match4(t) println(match4(Teacher("wenwen",19)))

6.嵌套函数

1.函数作为返回值

def funTest2():(String,String)=>String={ def fun2(str1:String,str2:String):String={ str1+"##"+str2+"%%" } fun2 } println(funTest2()("hello","world"))

需求分析:判断一个值是否可以整除3,然后在判断给定的两个值是否大于3,以此得出不同的结果

def getfunbyNum(num: Int): (Int, Int) => (String) => Unit = { if (num % 3 == 0) { def add(a: Int, b: Int): (String) => Unit = { if ((a + b) > 3000) { def show(name: String): Unit = { println(name + "你的收入很高") } show } else { def show(name: String): Unit = { println(name + "需要继续加油") } show } } add } else { def jian(a: Int, b: Int): (String) => Unit = { if ((a - b) < 3000) { def show(name: String): Unit = { println(name + "你是一个非常节约的人") } show } else { def show(name: String): Unit = { println(name + "省着点花钱") } show } } jian } } getfunbyNum(3)(1000,3000)("zhangdaxian") //柯里化

3.函数作为参数,函数作为返回值,匿名函数的结合使用

def funMsg(f: (String) => Int, str: String): (Int, Int) => Int = { var intNum = f(str) if (intNum % 3 == 0) { (a: Int, b: Int) => a + b } else { (a: Int, b: Int) => a - b } } val resultNum= funMsg((s:String)=>{ if(s.equals("上海")) 3 else 1 },"上海")(100,200) println(resultNum)
最新回复(0)