Scala教程(十一)Curry詳解與模式匹配
Scala教程(十一)Curry詳解與模式匹配
1 curry函式
1.1 curry化的函式
curry化的函式被應用了多個引數列表,而不是僅僅一個。
// 傳統函式
def curringSumOld(x:Int,y:Int) = x * y;
// curring化的函式被應用了多個引數列表
def curringSum(x:Int)(y:Int) = x + y;
println(curringSum(10)(15));
輸出結果: 25
1.2 curry佔位符
用偏應用函式表示式方式,把佔位符標註用在
// 用偏應用函式表示式方式,把佔位符標註用在curriedSum裡
val onePlus = curringSum(1)_
println(onePlus(12));
輸出結果: 131.3 curry對比
// 陣列對比
val a = Array("hello","scala");
val b = Array("HELLO","SCALA");
// 忽略大小寫對比
println(a.corresponds(b)(_.equalsIgnoreCase(_)));
輸出結果:
true2 模式匹配case class
2.1 match表示式
// 正則匹配
val pattern = "([0-9]+) ([a-z]+)".r;
"741258933 hadoop" match {
case pattern(num,item) => println(num+":"+item)
}
輸出結果:741258933:hadoop
2.2 陣列匹配
def match_array(arr:Any) = arr match{ case Array(0) => println("Array:0" ) case Array(x,y) => println("Array:x="+x+",y="+y ) case Array(0,_*) => println("Array:..." ) case _ => println("something else" ) } match_array(Array(0)) match_array(Array(0,1)) match_array(Array(0,1,2,3,4,5)) match_array(Array("one","two","three"))
輸出結果:
Array:0
Array:x=0,y=1
Array:...
somethingelse
2.3 case class匹配
Scala的case class使得對物件進行模式匹配變得非常方便,簡單的來說,Scala的case class就是在普通的類定義前加case這個關鍵字,然後你可以對這些類來模式匹配。
abstract class Person
case class Student(age:Int) extends Person
case class Worker(age:Int,salary:Double) extends Person
case object Shared extends Person
/**
* 1、宣告case class 每個成員都會預設生成val,如age:Int
* 2、每個case class 都會有伴生物件,每個伴生物件都會有自己case class的具體物件
* 3、模式匹配的時候,可以從case class提取內容,提取方法從apply中。
*/
object case_class_object {
def main(args: Array[String]): Unit = {
def caseOps(person:Person) = person match{
case Student(age) => println("I am " + age + " years old");
case Worker(_,salary) => println("Wow,I got "+salary)
case Shared => println("no property...");
}
caseOps(Student(19))
caseOps(Worker(19,4000))
caseOps(Shared)
val worker = Worker(29,3000);
val worker2 = worker.copy(salary = 5000);
val worker3 = worker.copy(age = 31);
}
}
輸出結果:
Iam 19 years old
Wow,Igot 4000.0
noproperty...
2.4 巢狀匹配
abstract class Item
case class Book(description: String, price: Double) extends Item
case class Bundle(description: String, price: Double, items: Item*) extends Item
object pattern_match_case_class_nested {
def main(args: Array[String]): Unit = {
def case_class_nested(person: Item) = person match {
// 匹配Bundle型別,巢狀Book型別,Item型別可以0到N個引數
case Bundle(_, _, art @ Book(_, _), rest @ _*) => println(art.description + " : " + art.price)
case Bundle(_, _, Book(descr, _), _*) => println("The first description is : " + descr)
case _ => println("Oops!!!")
}
// 輸出結果:Scala for the Spark Developer : 69.95
case_class_nested(Bundle("1111 Special's", 30.0,
Book("Scala for the Spark Developer", 69.95),
Book("Hadoop in Action", 69.95),
Book("Hive", 79.95),
Book("HBase", 32.86)))
}
}
輸出結果:Scala forthe Spark Developer : 69.95
2.5 Option匹配
Options語法:sealed關鍵字表示:封閉的、密封的、
sealed約束:
其修飾的trait,class只能在當前檔案裡面被繼承。
scala編譯器在檢查模式匹配的時候, scala就能夠在編譯時進行檢查是否所有的選項已經列在case中,減少程式設計的錯誤。
sealed abstract classOption[+A] extends Product withSerializable {
Options有兩個字類,分別讓車Some、None
Some中如果有具體的值,則用Some表示。反之,則用None表示。
程式碼示例:
def main(args: Array[String]): Unit = {
// 宣告陣列
val scores = Map("Alice" -> 99 , "Spark" -> 100)
// 模式匹配
scores.get("Alice") match {
// Option子類Some,有具體的值,則之輸出。
case Some(score) => println(score)
case None => println("No score")
}
}
輸出結果:99
--以上為Curry詳解與模式匹配內容,謝謝大家對我的關注。——厚積薄發(yuanxw)