一、柯理化
方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化。
def fun(a:Int,b:Int,c:Int)(d:Int)=a+b+c+d
println(fun(1,2,3)(4)) //10
def fun1(a:Int,b:Int)(c:Int)(d:Int)=a+b+c+d
println(fun1(1,2)(3)(4)) //10

二、模式匹配
模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
match 对应 Java 里的 switch,但是写在选择器表达式之后。match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。
def match(x:Int):String=x match{
case 1=>"one"
case 2=>"two"
case _=>"other" //其他选项用 "_"表示
}
println(match(1)) //输出one
def match1(x:Any) =x match{
case i:Int =>println("输入的值类型为Int类型,值为:"+i)
case j:String =>println("输入的值类型为String类型,值为:"+j)
case _ =>println("输入类型未知")
}
match1(2) //输入得值类型为Int类型,值为:2
更详细内容:模式匹配详解
三、样例类
使用了case关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。
case class Teacher(name:String,age:Int)
def match(teacher:Teacher) =teacher match{
case Teacher("mike",27) =>println("hello green")
case Teacher("green",35) =>printLn("hello green")
case x:Teacher=> println("hello x.name")
}
def main(args: Array[String]): Unit = {
var t=Teacher("green",35)
match(t)
}
四、隐式参数
方法可以具有隐式参数列表,由参数列表开头的implicit 关键字标记
- implict只能修改最尾部的参数列表,应用于其全部参数
- Scala可自动传递正确类型的隐式值
- 通常与柯里化函数结合使用
//隐式参数的定义
implicit var a:Int =10
implicit var b:String="hello"
五、隐式函数
隐式函数也称隐式转换,使用implicit修饰的函数
//注:隐式函数可以没有默认参数,即写成 implicit c:Int
def fun(a:Int,b:Int)(implicit c:Int=5):Int=a+b+c
println(fun(10,10)) //25
println(fun(10,10)(30)) //50
//带有隐式参数
implicit var a:Int= 10
def fun1(a:Int,b:Int)(implicit c:Int=5):Int=a+b+c
println(fun1(10,10)) //30
println(fun1(10,10)(20)) //40

隐式函数参数优先级
传参>隐式参数>默认参数
隐式函数应用场景
1、类型转换
implicit def DoubleToInt(a:Double)=a.ToInt
var x:Int=3.5
println(x) //打印结果3

implicit def stringToInt(x:String):Int=Integer.parseInt(x)
var x:Int="1"
println(x) //输出 1

2、类型增强
implicit def boolToInt(x:Boolean)=if(x) 1 else 0
println(1+true) //2
println(1+false) //1
本文深入探讨Scala编程语言的关键特性,包括柯理化(Currying)如何创建部分应用函数,模式匹配的使用方式及其在类型检查中的作用,样例类(case classes)在模式匹配中的优化,以及隐式参数和隐式函数的概念、应用场景,如类型转换和类型增强。了解这些特性有助于提升Scala编程的效率和代码质量。
948

被折叠的 条评论
为什么被折叠?



