Scala语法(四) 模式匹配

版权声明:欢迎转载,转载请说明出处. 大数据Github项目地址https://github.com/SeanYanxml/bigdata。 https://blog.csdn.net/u010416101/article/details/89642653

前言

Scala中的模式其实和Java中的switch类似. Scala中对于Java内的switch进行了扩展, 例如数组模式匹配、List模式匹配、偏函数等. 其功能要远远强于Java的简单的switch匹配.


正文

基本匹配

下方的例子中包含了多种模式匹配. 主要包括:

  • 字符串匹配
  • 混合数据类型匹配
  • 数组模式匹配
  • List模式类型
  • 元组模式匹配
import org.junit.Test
import scala.util.Random

/**
 * Scala内的模式匹配.
 * 
 * */
class CaseMatch {
  
  // 字符串匹配
//  @Test
  def 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.")
    }
  }
  
  // 混合数据类型匹配
//  @Test
  def 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")
     }
  }
  
  // 模式匹配数组类型
//  @Test
  def 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数据类型
  @Test
  def caseMatchList{
//    val lst = List(0,3,111)
      val lst = List(0,3)
    // List包括2哥部分组成 (head,tail)
    // Nil 表示尾部是一个空的List
    lst match{
      case 0 :: Nil => println("Only 0")
      // 加s字符串进行转义
      case x ::y::Nil => println(s"x: $x y:$y")
      // a
      case 0 :: a => println("0...")
      case _ => println("Something else.")
    }
  }
  
  // 模式匹配元组
  @Test
  def 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 {
  
  // 根据提交的任务进行模式匹配进行判断
  
  @Test
  def 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类型匹配
 @Test
 def caseMatchOption{
   // Some是有值 None是否有值
   val map = HashMap(("a",1),("b",2))
   val v = map.get("b")
   v match {
     case Some(i) => i
     case None => println("Null")
   }
   
   // 同时也可以通过getOrElse来进行实现
   // getOrElse就是通过match方法进行实现的.
   val v2 = map.getOrElse("b", 0)
   
 }
 

Scala–样例类(case)详解

偏函数

所谓偏函数, 没有match, 只有case的一段语句块. 其需要书写成def caseMatchFunctionA1 : PartialFunction[Int,Int] ={}的形式.

// 偏函数
  @Test
  def caseMatchFunctionA(num:Int) : Int = num match{
    case 1 => 1
    case 2 => 2
    case _ => -1
  }
  
  // 偏函数的写法 PartialFunction[输入参数类型,输出函数类型]
  @Test
  def caseMatchFunctionA1 : PartialFunction[Int,Int] = {
    case 1 => 1
    case 2 => 2
    case _ => -1
  }
    
  @Test
  def caseMatchFunctionB(str:String) : Int = str match{
    case "one" => 1
    case "two" => 2
    case _ => -1
  }
}
展开阅读全文

没有更多推荐了,返回首页