• scala中的模式匹配


    基本语法

    1 变量 match { 
    2   case 值1 => 代码
    3   case 值2 => 代码
    4   ...
    5   case 值N if (...) => 代码
    6   case _ => 代码
    7 }

    常量匹配

    1 scala> def matchConstant(x:Any) = x match {
    2      |   case 1 => "One"
    3      |   case "two" => "Two"
    4      |   case "3" => "Three"
    5      |   case true => "True"
    6      |   case null => "null value"
    7      |   case Nil => "empty list"
    8      |   case _ => "other value"
    9      | }

    特别需要注意的是,Nil是一个空的List,定义为List[Nothing]。

    变量匹配

    1 scala> def matchVariable(x:Any) = x match {
    2      |    case x if(x==1) => x
    3      |    case x if(x=="Tony") => x
    4      |    case x:String => "other value:" + x
    5      |    case _ => "unexpected value:"+x
    6      | }

    类型匹配

    1 scala> def matchType(x:Any) = x match {
    2      |   case s:String => "the string length is:"+s.length
    3      |   case m:Map[_,_] => "the map size is:"+m.size
    4      |   case _:Int | _:Double => "the number is:"+x
    5      |   case _ => "unexpected value:"+x
    6      | }

    case class匹配

     1 class DataFrameWork
     2 case class ComputationFramework(name: String, pupular:Boolean) extends  DataFrameWork
     3 case class StorageFramework(name:String, popular:Boolean) extends DataFrameWork
     4 
     5 def getBigDataType(data: DataFrameWork){
     6     data match {
     7       case ComputationFramework(name, popular) => println("[ComputationFramework]name: " + name + " and popular: " + popular)
     8       case StorageFramework(name, popular) => println("[StorageFramework]name: " + name + " and popular: " + popular)
     9       case _ => println("Other situation")
    10     }
    11   }

    option匹配

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

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

    数组匹配

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

    元组匹配

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

    List匹配

    def listMatch(list : List[String]) = list match {
        case head :: Nil => "匹配只有一个元素的情况"
        case x :: y :: Nil => "匹配只有两个元素的情况"
        case "丽丽" :: tail => "匹配以丽丽开始的情况"
        case head :: tail => "匹配多个元素的情况"
        case _ => "其他情况"
    }

    list分为head和tail两个部分,head是list的第一个元素,tail是list中除了head外的其余元素组成的list。用::连接list时,尾节点要声明成Nil。

    变量绑定

    可以将匹配的对象绑定到变量上。首先写一个变量名,然后写一个@符号,最后写入该匹配的对象。如果匹配成功,则将变量设置为匹配的对象。

     1 scala> case class Person(name: String, age: Int)
     2 defined class Person
     3 
     4 scala> val person = Person("Tony",18)
     5 person: Person = Person(Tony,18)
     6 
     7 scala> person match {
     8      |   case p @Person(_,age) => println(s"${p.name},age is $age")
     9      |   case _ => println("Not a person")
    10      | }
    11 Tony,age is 18

    参考:

    https://www.jianshu.com/p/d07e0bcfea3a

    https://www.jianshu.com/p/1456f065a4bb

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/029zz010buct/p/10194696.html
Copyright © 2020-2023  润新知