[Scala] Scala 学习笔记 (6) - 模式匹配

Scala模式匹配

模式匹配在工作中比较少用到,典型的场景就是异常捕获和偏函数。

1. 模式匹配

模式匹配规范:

    变量 match {
        case 值 => 代码
        case 值 => 代码
        case -  => 代码
    }

模式匹配函数

  import scala.util.Random

  val fruits = Array("apple", "banana", "orange")

  val fruit = fruits(Random.nextInt(fruits.length))
  fruit match {
    case "apple" => println("苹果")
    case "banana" => println("香蕉")
    case "orange" => println("橙子")
    case _ => println("Unknown fruit.")
  }

  println("==================================================")

  def greeting(array:Array[String]): Unit = {
    array match {
      case Array("scala") => println("hello scala")
      case Array(x, y) => println(x + " " + y)
      case Array("scala", _*) => println("Hi scala and there")          // _* 代表可变参数
      case Array(_*) => println("Hi there")
      case _ => println("Hi there 1")                                   // 与上面的等价
    }
  }

  greeting(Array("scala"))
  greeting(Array("scala","python"))
  greeting(Array("scala","python","java"))
  greeting(Array("python","java","scala"))

2. 应用场景

2.1 异常捕获

  try {
//    val i = 1/0
    val file = Source.fromFile("test1.txt")(Codec.UTF8)
  } catch {
    // 模式匹配,没有顺序,完全模式匹配
    case e: ArithmeticException => throw new RuntimeException("除数不能为0")   // 抛出异常,程序停止
    case e: FileNotFoundException => println("文件找不到")                     // 只打印异常,程序不停止
    case e: Exception => println(e.getMessage)
    case _ => println(" : ")                                                  // 剩下的情况
 
  } finally {
    println("finally")

2.2 偏函数PartialFunction

偏函数:被包在花括号内没有match的一组case语句。

偏函数可以理解为模式匹配里面的一种特殊情况,它在spark源码里面是有体现的(源码搜索PartialFunction)。

  // 模式匹配函数
  def sayChineseName(name:String) = name match {
    case "apple" => println("苹果")
    case "banana" => println("香蕉")
    case "orange" => println("橙子")
    case _ => println("Unknown fruit.")
  }
  sayChineseName("apple")

  // 偏函数
  /**
    *
    * PartialFunction[A,B]: A代表入参类型,B代表出参类型
    */
  def sayChineseName2:PartialFunction[String, String] = {
    case "apple" => "苹果"
    case "banana" => "香蕉"
    case "orange" => "橙子"
    case _ => "Unknown fruit."
  }
  println(sayChineseName2("apple"))

猜你喜欢

转载自blog.csdn.net/wawa8899/article/details/81194627