3.3 简单模式匹配

Scala中没有提供与Java语言中switch类似的语法,但是提供了一个更加强大的模式匹配功能。模式匹配是一个Scala 概念,它看上去与其它语言中的一个switch 语句很类似。不过,它是一个比switch 语句更强大的工具。根据值检查模式的过程称为模式匹配。

一个模式匹配的简单应用是作为多级if-else 语句的替代,这可以提高代码的可读性。模式匹配不使用关键字switch,Scala使用关键字match。每个可能的匹配由关键字case 处理。如果有一个case 被匹配到,那么右箭头右侧的代码被执行。其中下划线_代表默认case。如果前面没有一个case 匹配上的话,默认case 的代码会被执行。与switch 语句不同,在每个case 后的代码不需要break 语句。只有匹配的case 会被执行。另外,每个=>右侧的代码是一个表达式,返回一个值。因此,一个模式匹配语句本身是一个表达式,返回一个值。

请看下面的示例:根据输入的数字,给出对应的星期。

val day = 8
val month = day match{
  case 1 => "星期一"
  case 2 => "星期二"
  case 3 => "星期三"
  case 4 => "星期四"
  case 5 => "星期五"
  case 6 => "星期六"
  case 7 => "星期天"
  case _ => "不正确"
}
println(month)

输出结果为:

不正确

【示例】从控制台输入一个整数,给出对应的月份描述。

import java.io._

print("控制台输入一个整数 :")
val br = new BufferedReader(new InputStreamReader(System.in));
val line = br.readLine().toInt
val month = line match {
    case 1 => "一月份"
    case 2 => "二月份"
    case 3 => "三月份"
    case 4 => "四月份"
    case 5 => "五月份"
    case 6 => "六月份"
    case 7 => "七月份"
    case 8 => "八月份"
    case 9 => "九月份"
    case 10 => "十月份"
    case 11 => "十一月份"
    case 12 => "十二月份"
    case _ => "无效的月份值" // 默认值
}

println("month:" + month)
br.close()

说明:在Scala 2.11中,可以用scala.io.StdIn.readLine()函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readDouble、readByte、readShort、readLong、readFloat、readBoolean或者readChar。

import scala.io.StdIn.readLine

val input = readLine("请输入内容:")
println("您输入的是:" + input)
printf("您输入的是:%s\n", input)
println(s"您输入的是:$input")

【例】使用模式匹配实现一个简单的菜单选择。

import scala.io.StdIn

object demo {
def main(args: Array[String]): Unit = {
  // 类似switch
  val taste =
    """
      |1 - "香橙味"
      |2 - "葡萄味"
      |3 - "水蜜桃味"
      |4 - "菠萝味"
    """.stripMargin
  println(s"口味:$taste")

  val input = StdIn.readLine("请选择您的口味:")

  // 模式匹配
  val msg = input match {
    case "1" => "香橙味"
    case "2" => "葡萄味"
    case "3" => "水蜜桃味"
    case "4" => "菠萝味"
    case _ => "不存在的口味"
  }

  println(s"您选择的是$msg")
}
}

一个case语句也可以匹配多个条件。请看下面的代码:

val day = 6
val weekDay = day match{
  case 1|2|3|4|5 => "工作日"
  case 6|7 => "周末"
  case _ => "不正确"
}

匹配更多的类型:

    println("---------------------------")
  // 一个case语句匹配多个条件
  // 匹配多个值
  val i = 5
  i match {
    case 1 | 3 | 5 | 7 | 9 => println("奇数")
    case 2 | 4 | 6 | 8 | 10 => println("偶数")
  }

  // 匹配字符串类型
  val cmd = "stop"
  cmd match {
    case "start" | "go"           => println("starting")
    case "stop" | "quit" | "exit"   => println("stopping")
    case _                   => println("doing nothing")
  }
 
© 版权声明
THE END
喜欢就支持一下吧
点赞222赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容