现在的位置: 首页 > 综合 > 正文

scala学习十四 模式匹配

2019年05月24日 ⁄ 综合 ⁄ 共 1739字 ⁄ 字号 评论关闭

模式匹配详解:

package matchtest;

class matchtest {

  var d:Int=0;
  
  def mat(a: Int) {
    a match {
      case 1 => print(a + "*" * a+"第一个方法")
      case ch if Character.isDigit(ch) => print("自动赋值给ch"+ch);
      case _ => print("默认的方法,如果上面的都没有匹配");
    }
  }
}

object matchtest extends App{

  val matest=new matchtest
  matest.mat('1')
}

类型的匹配(并将值赋给case后面的变量)

package matchtest;

class matchtest {

  var d:Int=0;
  
  def mat(a: Int) {
    a match {
      case 1 => print(a + "*" * a+"第一个方法")
      case ch if Character.isDigit(ch) => print("自动赋值给ch"+ch);
      case _ => print("默认的方法,如果上面的都没有匹配");
    }
  }
  
  def mat2(ref:Any){
    ref match {
      case a:Int =>print("这个是int")
      case b:String =>print("这个是string")
      case _ =>print("这个不再匹配的范围")
    }
  }
}

object matchtest extends App{

  val matest=new matchtest
  matest.mat2("ssss")
}

注意:当要使用模式匹配去匹配特定的map是:Map[ int,String ]   别这样做,应为jvm在运行时会擦出类型信息,但是做一个统一的匹配是可以的    case m:Map[ _, _ ] =>xxxx

数组的匹配和列表的匹配:

 def mat3(a: Array[Any]) {
    a match {
      case Array(0) => { print("匹配包含0这个元素的数组") }
      case Array(x, y) => { print("匹配只包含两个元素的数组") }
      case Array(x, _*) => { print("匹配以0开头的数组") }
    }
  }
  def mat4(a: List[Any]) {
    a match {
      case 0 :: Nil => { print("匹配包含0这个元素的数组") }
      case x :: y :: Nil => { print("匹配只包含两个元素的数组") }
      case 0 :: tail => { print("匹配以0开头的数组") }
      case _ =>print("默认匹配")
    }
  }

样例类的作用(匹配具体的子类,在给出具体的行为):

package matchtest

class account

case class account1(double: Double) extends account
case class account2(double: Double, double2: Double) extends account
case object Nothing extends account

class acco  {
  
  def mat(acc: account) {
    acc match {
      case account1(a) => print("a"+a)
      case account2(a, b) => print("a:"+ a + "b"+b)
      case _ => print("xxx")
    }
  }
}

当在使用样例类进行匹配的时候,可能需要编译器帮助盘但样例类是否全面,则需要在基类前加 sealed 关键字

package matchtest

sealed class account     //加了sealed 在对account的扩展只有在本文件有效

case class account1(double: Double) extends account
case class account2(double: Double, double2: Double) extends account
case object Nothing extends account

class acco  {
  
  def mat(acc: account) {
    acc match {
      case account1(a) => print("a"+a)
      case account2(a, b) => print("a:"+ a + "b"+b)
      case _ => print("xxx")
    }
  }
}

抱歉!评论已关闭.