7.パターンマッチングとサンプルクラス
Scalaは非常に強力なパターンマッチングの仕組みを持っている、それは多くの機会にも適用することができます:switch文、検査の種類として。そして、Scalaはまた、サンプルのクラスを提供し、パターンマッチングは、最適化されてすぐに一致させることができます。
7.1。マッチする文字列
パッケージは cn.itcast.cases
インポート scala.util.Randomのオブジェクトが CaseDemo01 延びアプリ{ ヴァルARRは = アレイ("Hadoopの"、"のZooKeeper" 、"スパーク")ヴァルの名 = ARR(にRandom.nextInt(ARR .LENGTH))名一致 { ケース「のHadoop」 => のprintln(「ビッグデータストレージおよび分散コンピューティングフレームワーク...」)のケース「のZooKeeper」 => のprintln(「ビッグデータ分散協調サービスフレームワーク...」)
ケース「スパーク」 => printlnの(「ビッグデータ分散メモリコンピューティングフレームワーク...」)
ケース _ => printlnを(「私は...あなたを知りません」)
}
} |
7.2。マッチタイプ
パッケージは cn.itcast.cases
インポート scala.util.Randomのオブジェクト CaseDemo01が延びアプリ{ ヴァルARR = 配列("こんにちは"、1、2.0、CaseDemo)ヴァルのV =のARRは(にRandom.nextInt(4))のprintln(V)のV 一致を { 場合 X:のInt => のprintln("INT" + x)の場合の Y:ダブル場合(Y> = 0)=> のprintln("ダブル" + y)の場合文字列=>:Z のprintln
("文字列" + Z)
の場合 _ => 新しい投げる例外("例外と一致していません")
}
} |
注意:ケースY:ダブルあれば(Y> = 0)=> ...
ときにパターンマッチングもガード条件を追加することができます。あなたは警備員の条件を満たしていない場合は、中_ケースに分類されます。
7.3。マッチングアレイタプル、設定、
package cn.itcast.cases
object CaseDemo03 extends App{
val arr = Array(1, 3, 5)
arr match {
case Array(1, x, y) => println(x + " " + y)
case Array(0) => println("only 0")
case Array(0, _*) => println("0 ...")
case _ => println("something else")
}
val lst = List(3, -1)
lst match {
case 0 :: Nil => println("only 0")
case x :: y :: Nil => println(s"x: $x y: $y")
case 0 :: tail => println("0 ...")
case _ => println("something else")
}
val tup = (1, 3, 7)
tup match {
case (1, x, y) => println(s"1, $x , $y")
case (_, z, 5) => println(z)
case _ => println("else")
}
} |
注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
7.4. 样例类
在Scala中样例类是一种特殊的类,可用于模式匹配。
定义形式:
case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)
case object 类型,是单例的。 case object Person
package cn.itcast.cases
import scala.util.Random
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask
object CaseDemo04 extends App{
val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
arr(Random.nextInt(arr.length)) match {
case SubmitTask(id, name) => {
println(s"$id, $name")
}
case HeartBeat(time) => {
println(time)
}
case CheckTimeOutTask => {
println("check")
}
}
} |
7.5. Option类型
在Scala中Option类型用样例类来表示可能存在或者可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值
package cn.itcast.cases
object OptionDemo {
def main(args: Array[String]) {
val map = Map("a" -> 1, "b" -> 2)
val v = map.get("b") match {
case Some(i) => i
case None => 0
}
println(v)
//更好的方式
val v1 = map.getOrElse("c", 0)
println(v1)
}
} |
7.6. 偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。
package cn.itcast.cases
object PartialFuncDemo {
valfunc1: PartialFunction[String, Int] = {
case "one" => 1
case "two" => 2
case _ => -1
}
def func2(num: String) : Int = num match {
case "one" => 1
case "two" => 2
case _ => -1
}
def main(args: Array[String]) {
println(func1("one"))
println(func2("one"))
}
} |