您的位置:首页 > 其它

Scala模式匹配和样例类

2018-03-03 22:05 357 查看

Scala模式匹配和样例类

Scala 有一个十分强大的模式匹配机制,可以应用到很多场合:如 switch 语句、类型检查等。并且 Scala 还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

1. 匹配字符串

package cn.cheng.cases
import scala.util.Random
object CaseDemo01 extends App{
val arr = Array (" " hadoop" ", " " zookeeper" ", " " spark" ")
val name = arr (Random.nextInt( arr .length))
name match {
case " " hadoop" " => println (" " 大数据分布式存储和计算框架 ...")
case " " zookeeper" " => println (" " 大数据分布式协调服务框架 ...")
case " " spark" " => println (" " 大数据分布式内存计算框架 ...")
case _ => println (" " 我不认识你 ...")
}
}


2. 匹配类型

package cn.cheng.cases
import scala.util.Random
object CaseDemo01 extends App{
val arr = Array ( "hello", 1, 2.0, CaseDemo)
val v = arr (Random.nextInt(4))
println ( v )
v match {
case x: Int => println (t "Int " " + x)
case y: Double if(y >= 0) => println (e "Double " "+ y)
case z: String => println (g "String " " + z)
case _ => w throw w new Exception(t "not h match exception")
}
}


注意 :case y: Double if(y >= 0) => …

模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入 case _中。

3. 匹配数组、元组、集合

package cn.cheng.cases
object CaseDemo03 s extends App{
val arr = Array (1, 3, 5)
arr match {
case Array (1, x, y) => println (x + " " " " + y)
case Array (0) => println (y "only 0")
case Array (0, _*) => println (0 "0 ...")
case _ => println (g "something else")
}
val lst = List (3, -1)
lst match {
case 0 :: Nil => println (y "only 0")
case x :: y :: Nil => println (: s"x: $ $x : y: $ $y" ")
case 0 :: tail => println (0 "0 ...")
case _ => println (g "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))

4. 样例类

在 Scala 中样例类是一种特殊的类,可用于模式匹配。

定义形式:

case class 类型,是多例的,后面要跟构造参数。

case object 类型,是单例的

package cn.cheng.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")
}
}
}


5. Option 类型

在 Scala 中 Option 类型用样例类来表示可能存在或者可能不存在的值(Option 的子类有Some 和 None)。Some 包装了某个值,None 表示没有值。

package cn.cheng.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)
}
}


6. 偏函数

被包在花括号内没有 match 的一组 case 语句是一个偏函数,它是 PartialFunction[A, B]的一个实例,A 代表输入参数类型,B 代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。

package cn.cheng.cases
object PartialFuncDemo {
val func1: 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"))
}
}


喜欢就点赞评论+关注吧



感谢阅读,希望能帮助到大家,谢谢大家的支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala