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)