Scala函数学习二

it2024-11-29  4

1.函数作为参数,函数作为返回值,匿名函数 实例1:传入一个字符串,如果它的长度大于5则返回加法,小于5返回减法,等于5返回乘法

def funTest2 (s: String) : (Int, Int) => = { if (s.length > 5) { def funAdd(a : Int,b : Int) : Int = { a + b } funAdd } else if (s.length < 5) { def funJian(a : Int,b : Int) : Int = { a - b } funJian } else { def funChen(a : Int, b : Int) : Int = { a * b } funChen } } var intValue = funTest2("Aythna") (100,200) println(intValue)

测试结果如下

实例2:传入一个值,如果他能被3整除则返回加法,反则返回减法

def funTest3(s : Int) : (Int,Int) => Int = { if (s % 3 == 0) { def Add(a : Int , b : Int) : Int ={ a + b } Add } else { def Jian (a : Int , b : Int) : Int = { a - b } Jian } } var intValue1 = funTest3(6)(2,5) println(intValue1)

测试结果如下

实例3:传入三个值a,b,c和一个字符串,如果a能被3整除,且b+c大于3000,返回xxx,否则返回xxx;如果a不能被3整除,且a-b小于3000,返回xxx,否则返回xxx

def getNum(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("Congratulations:" + name) } show } else { def show (name : String) : Unit = { println("Sry:" + name) } } } 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 } } getNum(6)(2000,1001)("Aythna")

测试结果如下

实例4:传入一个函数,一个字符串,两个值a和b,根据输入的字符串调用输入的函数来传入不同的参数intNum,判断intNum是否能被3整除,能则返回a+b,否则返回a-b

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 2 },"上海") (100,200) println(resultNum)

测试结果如下

2.函数柯里化 方法可以定义多个参数列表,当使用较少的参数列表调用参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为参数。这被称为柯里化。 实例:几种不同的柯里化方法

def fun (a : Int , b : Int , c : Int , d : Int) : Int = { a+b+c+d } 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(fun(1,2,3,4)) println(fun1(1,2)(3,4)) println(fun2(1,2,3)(4)) println(fun3(1)(2)(3)(4)) println(fun4(1)(2,3,4))

测试结果如下

3.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记 implicit只能修改最为不的参数列表,应用于其全部参数 Scala可自动传递正确类型的隐式值 通常与柯里化函数结合使用 相关优先级为:传参>隐式参数>默认

def sum(x ; Int) (Implicit y : Int) = x+y implicit var a = 10 //将作为Int类型隐式值自动传递 sum(10) //20 实例1:隐式参数值设置为10,不设置传参和默认值 implicit var a : Int = 10 def fun (a : Int , b : Int) (implicit c : Int) : Int = { a+b+c } println("fun结果" + fun(10,10))

测试结果如下

实例2:隐式参数值设置为10,设置传参为20,不设置默认值

implicit var a : Int = 10 def fun (a : Int , b : Int) (implicit c : Int) : Int = { a+b+c } println("fun结果" + fun(10,10)(20))

测试结果如下

实例3:不设置隐式参数值,不设置传参,设置默认值为5

def fun (a : Int , b : Int) (implicit c : Int = 5) : Int = { a+b+c } println("fun结果" + fun(10,10))

测试结果如下

实例4:设置隐式参数值为10,默认值为5,不设置传参

implicit var a : Int = 10 def fun (a : Int , b : Int) (implicit c : Int = 5) : Int = { a+b+c } println("fun结果" + fun(10,10))

测试结果如下

实例5:设置int型隐式参数a,值为10;设置String型隐式参数str,为"Hello"

implicit var a : Int = 10 implicit var str : String = "Hello" def fun3 (a : Int, b : Int) (implicit c : Int = 5 , str : String) : Int = { println(str) a+b+c } println("fun3结果为:" + fun3(10,11)(c = 20 , str = "Hehe"))

测试结果如下

4.隐式函数 隐式函数也称隐式转换,使用implicit修饰函数 实例:类型转换

implicit def DoubleToInt (a : Double) : Int = { a.toInt } val a1 : Int = 3.99 println(a1)

测试结果如下

5.模式匹配 实例1:

def match1 (x : Int) : String = x match { case 1 => "one" case 2 => "two" case _ => "many" } def main(args : Array[String]) : Unit = { println(match1(4)) }

测试结果如下

实例2:

def match2 (x : Any) : Unit = x match { case 1 => println("输入的值为1") case i : Int => println("输入的值类型为Int类型,值为:" + i) case s ; String => println("输入的值类型为String类型,值为:" + s) case _ => println("I know Nothing") } def main(args : Array[String]) : Unit = { match("Aythna") }

测试结果如下

6.样例类 实例:

case class Teacher (name : String , age : Int) def match3 (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) } } def main(args : Array[String]) : Unit = { val t = Teacher("Aythna",17) val t1 = Teacher("Aythna",17) if (t == t1) { println("SameOne") } else { println("Different") } match3(t) }

测试结果如下

最新回复(0)