[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"))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值