Scala Match

Scala中的match关键字类似于Java的switch case,但更强大。它可以匹配值、类型和类实例。case class在match中特别有用,提供简洁的匹配方式。通过定义case class并利用其特性,可以简化匹配条件和提高代码可读性。

Scala中的match类似与Java中的switch case结构。在理解match之前,记住scala中,几乎一切都是表达式。

匹配值

  val times = 1                                   //> times  : Int = 1

  times match { 
    case 1 => "one"
    case 2 => "two"
    case _ => "some other number"
  }                                               //> res0: String = one

  val timeEnglish = times match {
    case 1 => "one"
    case 2 => "two"
    case _ => "some other number"
  }                                               //> timeEnglish  : String = one

可以看到,中间部分的times …其实是作为一个表达式存在的,因此我们可以把结果付给timeEnglish这个变量。其中下划线_表示其他未匹配的内容,类似与Java中的default。
我们也可以根据待匹配得知做条件判断:

times match {
  case i if i == 1 => "one"
  case i if i == 2 => "two"
  case _ => "some other number"
}

case后面先给待匹配的值取个别名,便于做条件判断。

匹配类型

除了根据值匹配外,还可以根据类型匹配:

def bigger(o: Any): Any = {
  o match {
    case i: Int if i < 0 => i - 1
    case i: Int => i + 1
    case d: Double if d < 0.0 => d - 0.1
    case d: Double => d + 0.1
    case text: String => text + "s"
  }
}

匹配类实例

def calcType(calc: Calculator) = calc match {
  case _ if calc.brand == "hp" && calc.model == "20B" => "financial"
  case _ if calc.brand == "hp" && calc.model == "48G" => "scientific"
  case _ if calc.brand == "hp" && calc.model == "30B" => "business"
  case _ => "unknown"
}

这里的条件判断中直接使用待匹配的变量名calc。整个match表达式的值就作为方法的返回值。
但是这样比较很繁琐啊,因此scala提供了特殊的类叫case class,这类class专门为match case准备。

case class

使用关键字case 和class定义case类:

 case class Calculator(brand: String, model: String)

case类实例化的时候可以不用new关键字:

Calculator("Kosio" , "HH")       //> res0: test.Calculator = Calculator(Kosio,HH)

case类可以像正常类一样定义方法。

使用case class做match的时候,就很方便了:

val hp20b = Calculator("hp", "20B")
val hp30b = Calculator("hp", "30B")

def calcType(calc: Calculator) = calc match {
  case Calculator("hp", "20B") => "financial"
  case Calculator("hp", "48G") => "scientific"
  case Calculator("hp", "30B") => "business"
  case Calculator(ourBrand, ourModel) => "Calculator: %s %s is of unknown type".format(ourBrand, ourModel)
}

最后偶一个case匹配前面都没有匹配到的情况,也可以这么写:

case Calculator(_, _) => "Calculator of unknown type"

甚至可以不关心他时不时Calculator:

 case _ => "Calculator of unknown type"

或者我们可以将匹配的值重新绑定到另一个名字:

case c@Calculator(_, _) => "Calculator: %s of unknown type".format(c)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值