本文主要是介绍Scala语法(四) 模式匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
Scala中的模式其实和Java中的switch
类似. Scala
中对于Java内的switch
进行了扩展, 例如数组模式匹配、List模式匹配、偏函数等. 其功能要远远强于Java
的简单的switch
匹配.
正文
基本匹配
下方的例子中包含了多种模式匹配. 主要包括:
- 字符串匹配
- 混合数据类型匹配
- 数组模式匹配
- List模式类型
- 元组模式匹配
import org.junit.Test
import scala.util.Random/*** Scala内的模式匹配.* * */
class CaseMatch {// 字符串匹配
// @Testdef caseMatchString{// 定义需要匹配的数组val arr = Array("Sean","Abel","Bruce")// 随机指定一个字符串val name = arr(Random.nextInt(arr.length))println(name)name match{case "Sean" => println("Sean is a good people.")case "Abel" => println("Abel is a good gay.")case _ => println("default matches.")}}// 混合数据类型匹配
// @Testdef caseMatchFix{val arr = Array("Sean",1.0,2)// 随机指定一个变量val variable = arr(Random.nextInt(arr.length))println(variable)variable match{case str:String => if(str.equals("Sean")){println("String Sean.")}case num:Int => println("Int Number: "+num)case num:Double => println("Double Number"+num)case _ => throw new Exception("Not Match Exception.s")}}// 模式匹配数组类型
// @Testdef caseMatchArray{val arr = Array(0,1,5)// _* 表示可以匹配任意多的参数arr match{case Array(1,x,y) => println(x+" "+y)case Array(0,1,5) => println("Only 0")case Array(0, _*) => println("0...")case _ => println("Something Else.")}}// 模式匹配List数据类型@Testdef caseMatchList{
// val lst = List(0,3,111)val lst = List(0,3)// List包括2哥部分组成 (head,tail)// Nil 表示尾部是一个空的Listlst match{case 0 :: Nil => println("Only 0")// 加s字符串进行转义case x ::y::Nil => println(s"x: $x y:$y")// acase 0 :: a => println("0...")case _ => println("Something else.")}}// 模式匹配元组@Testdef caseMatchTuple{val tup = (6,3,5)tup match {case (1,x,y) => println(s" 1,$x,$y")case (_,z,5) => println(z)case _ => println("else")}}}
样例类与类模式匹配
样例类case class
, 快速创建的类.其中, 会自动生成部分方法. 除了样本类之外, 还有样例对象case object
.
// 上诉样例类可能不在一个文件内, 需要手动导入.
case class SubmitTask(id:String, name:String)
case class HeartBeatTask(time:Long)
case object CheckTimeoutTask
class CaseMatchClass {// 根据提交的任务进行模式匹配进行判断@Testdef caseMatch{// 样例类可以new, 也可以不new出来.val arr = Array(CheckTimeoutTask,HeartBeatTask(123),SubmitTask("0001","Task-001"))val obj = arr(Random.nextInt(arr.length))obj match{case SubmitTask(id,name) =>{println("SubmitTask.")}case HeartBeatTask(time) =>{println("HeartBeatTask.")}case CheckTimeoutTask => {println("CheckTimeoutTask.")}}}
- Option类型匹配
对于Map
数据类型内的对象. 不确定内部对象是否存在. 我们在使用时也可以对其进行模式匹配. 但是个人还是推荐使用getOrElse(<>,<>)
方法较为方便一点.
// Option类型匹配@Testdef caseMatchOption{// Some是有值 None是否有值val map = HashMap(("a",1),("b",2))val v = map.get("b")v match {case Some(i) => icase None => println("Null")}// 同时也可以通过getOrElse来进行实现// getOrElse就是通过match方法进行实现的.val v2 = map.getOrElse("b", 0)}
Scala–样例类(case)详解
偏函数
所谓偏函数, 没有match, 只有case的一段语句块. 其需要书写成def caseMatchFunctionA1 : PartialFunction[Int,Int] ={}
的形式.
// 偏函数@Testdef caseMatchFunctionA(num:Int) : Int = num match{case 1 => 1case 2 => 2case _ => -1}// 偏函数的写法 PartialFunction[输入参数类型,输出函数类型]@Testdef caseMatchFunctionA1 : PartialFunction[Int,Int] = {case 1 => 1case 2 => 2case _ => -1}@Testdef caseMatchFunctionB(str:String) : Int = str match{case "one" => 1case "two" => 2case _ => -1}
}
这篇关于Scala语法(四) 模式匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!