Scala语言入门四(模式匹配)

Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式

一、语法

变量 match {
    case value1 => 代码1
    case value2 => 代码2
    ...
}

match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。

match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配

二、简单案例

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    // 打印 many
    println(matchTest(3))
  }

  def matchTest(x: Int): String = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "many"
  }
}

三、类型匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    println(matchTest2("test"))
    println(matchTest2(6))
  }

  def matchTest2(x: Any): Any = x match {
    case x: String => "Scala.String"
    case y: Int => "scala.Int"
    case _ => "many"
  }
}

实例中第一个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型模式,用于判断传入的值是否为整型,相比使用isInstanceOf来判断类型,使用模式匹配更好。第四个 case 表示默认的全匹配备选项,
即没有找到其他匹配时的匹配项,类似 switch 中的 default

四、条件匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    println(matchTest3(1))
    println(matchTest3("hello"))
    println(matchTest3(2))
  }

  def matchTest3(value: Any): Any = value match {
    case 1 => "输入的是:1"
    case _ if (value.equals("hello")) => "world"
    case _ => value
  }
}

如果输入的不是1,那么会先进行条件判断,满足第二个case的话会走第二个case,否则会走最后一个case

五、数组匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]) {
    // 满足第一个case
    println(matchTest4(Array(1)))
    // 不满足第一个和第二个
    println(matchTest4(Array(1,2)))
    // 满足第二个
    println(matchTest4(Array(2)))
  }

  def  matchTest4(x: Array[Any]): Int = x match {
    case Array(1) => 1
    case Array(2, _*) => 666
    case _ => 0
  }
}

六、List匹配

和数组过滤类似,这里不再讲解,可以自己玩几把

七、样例类匹配

使用了case关键字的类定义就是就是样例类(case class),样例类是种特殊的类,经过优化以用于模式匹配

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]): Unit = {
    println(matchTest5(Person("张三")))
    println(matchTest5(Person("李四")))
    println(matchTest5(Person("老王")))
  }

  def matchTest5(x:Person):String = x match {
    case Person("张三") => "张三"
    case Person("李四") => "李四"
    case _ => "xx"
  }
}

// 样例类
case class Person(name: String)

八、异常处理

/**
 * @author Gjing
 **/
object MatchApp {
  def main(args: Array[String]): Unit = {
    try {
      val i = 10 / 0
      println(i)
    } catch {
      case e: ArithmeticException => println("除数不能为0")
      case e:Exception => println("最大异常")
    }finally {
      // 资源释放的东西,和java类似
    }
  }
}
上一篇:[汇编] 在屏幕*显示时钟


下一篇:Nginx+Proxy_cache高速缓存配置