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第14章----模式匹配和样例类
- scala习题(14)——模式匹配和样例类
- Scala之模式匹配和样例类
- 【转】Scala学习——模式匹配和样例类
- scala的模式匹配和样例类
- 快学Scala-模式匹配、样例类、Option类、偏函数
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
- scala学习笔记(十三) 模式匹配与样例类
- 快学Scala习题解答—第十四章 模式匹配和样例类
- Scala入门到精通——第十五节 Case Class与模式匹配(二)
- 第四课 Scala模式匹配、类型系统彻底精通与Spark源码阅读
- 第13课 Scala模式匹配实战
- Scala中正则表达式以及与模式匹配结合
- Spark源码中的Scala模式匹配编程和Scala模式匹配编程操作实战
- Scala之模式匹配
- scala基础-模式匹配
- scala 开发入门(8)-- 模式匹配
- 2016 第四讲 Scala模式匹配、类型系统彻底精通与Spark源码阅读
- scala模式匹配下的赋值语句
- Scala 模式匹配