Scala模式匹配

模式匹配是Scala中非常有特色且强大的功能。模式匹配类似于Java中的swich case语法即对一个值进行条件判断,针对不同的条件进行不同的处理。

但是Scala的模式匹配的功能比Java的swich case语法的功能要强大地多,Java的swich case语法只能对值进行匹配。Scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。

模式匹配语法

scala使用match case的语法进行模式匹配。

变量 match { 
  case 值1 => 代码
  case 值2 => 代码
  case _ => 代码
}

如果值为下划线,则代表了不满足以上所有情况下的默认情况如何处理。
此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。

变量值的模式匹配

使用case 值 => 代码这种语法进行值的模式匹配
Scala的模式匹配语法可以在值后面再加一个if守卫进行双重过滤。

def getSalary(name: String, age: Int) {
    name match {
      case "Spark" => println("$150000/year")
      case "Hadoop" => println("$130000/year")
      case _ if name == "Scala" => println("$140000/year")
      case _ if name == "Python" => println("$100000/year")
      case _ if name == "Hadoop MapReduce" => println("$90000/year")
      case _name if age > 5 => println("name : " + name + " age : " + age + " $120000/year")
      case _ => println("$80000/year")
    }
  }

类型的模式匹配

def getMatchType(msg : Any) {
    msg match {
      case i : Int => println("Integer")
      case s : String => println("String")
      case d : Double => println("Double")
      case _ => println("Unknown type")
    }
  }

case class的模式匹配

class DataFrameWork
case class ComputationFramework(name: String, pupular:Boolean) extends  DataFrameWork
case class StorageFramework(name:String, popular:Boolean) extends DataFrameWork

def getBigDataType(data: DataFrameWork){
    data match {
      case ComputationFramework(name, popular) => println("[ComputationFramework]name: " + name + " and popular: " + popular)
      case StorageFramework(name, popular) => println("[StorageFramework]name: " + name + " and popular: " + popular)
      case _ => println("Other situation")
    }
  }

Option的模式匹配

Scala有一种特殊的类型Option,Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了。

def getValue(key:String, content:Map[String, String]){
    content.get(key) match {
      case Some(value) => println(value)
      case None => println("NOT FIND")
    }
  }

数组的模式匹配

def getMatchCollection(msg : Array[String]) {
    msg match {
      case Array("Scala") => println("One Element")
      case Array("Scala", "Java") => println("Two Element")
      case Array("Spark", _*) => println("Some Element begin with Spark")
      case _ => println("Unknown type")
    }
  }

Tuple的模式匹配

def tupleMatch(t : Tuple2[String, String]) : String = t match {
    case ("A", _) => "匹配以A开始的二元组"
    case (_, "A") => "匹配以A结束的二元组"
    case _ => "其他情况"
}

List 的模式匹配

def listMatch(list : List[String]) = list match {
    case head :: Nil => "匹配只有一个元素的情况"
    case x :: y :: Nil => "匹配只有两个元素的情况"
    case "丽丽" :: tail => "匹配以丽丽开始的情况"
    case head :: tail => "匹配多个元素的情况"
    case _ => "其他情况"
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容