Scala—— 21.模式匹配未完

Scala中的模式匹配类似于Java中的switch语法,模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有的case都不匹配,那么会执行case_分支,类似于Java中的default语句。

1.基本形式

如果所有case都不匹配,那么会执行case_分支,类似于Java中的default语句。
如果所有case都不匹配,又没有写case_分支,那么会抛出MatchError。
每个case中,不用break语句,自动中断case。
可以在match中使用其它类型,而不仅仅是字符。
=> 等价于 java switch的 :。
=> 后面的代码块到下一个case,是作为一个整体执行,可以使用{}扩起来,也可以不扩 。

    val oper = '+'
    val n1 = 20
    val n2 = 10
    var res = 0  
    oper match {
      case '+' => {
        res = n1 + n2
        println("ok~~")
        println("hello~~")
      }
      case '-' => res = n1 - n2
      case '*' => res = n1 * n2
      case '/' => res = n1 / n2
      case 1 => println("匹配到1")
      case 1.1 => println("匹配1.1")
      case _ => println("oper error")
    }
 for (ch <- "+-3!") { //是对"+-3!" 遍历
      var sign = 0
      var digit = 0
      ch match {
        case '+' => sign = 1
        case '-' => sign = -1
        // 说明..
        // 如果 case 后有 条件守卫即if ,那么这时的 _ 不是表示默认匹配
        // 表示忽略 传入 的 ch
        case _ if ch.toString.equals("3") => digit = 3
        case _ => sign = 2
      }
     }

2.模式中的变量

val ch = 'U'
ch match {
  case '+' => println("ok~")
  // 下面 case mychar 含义是 mychar = ch
  case mychar => println("ok~" + mychar)
  case _ => println("ok~~")
}
 
val ch1 = '+'
//match是一个表达式,因此可以有返回值
//返回值就是匹配到的代码块的最后一句话的值
val res = ch1 match {
  case '+' => ch1 + " hello "
  case _ => println("ok~~")
}

3.类型匹配

val a = 8
//说明 obj 实例的类型 根据 a 的值来返回
val obj = if (a == 1) 1
else if (a == 2) "2"
else if (a == 3) BigInt(3)
else if (a == 4) Map("aa" -> 1)
else if (a == 5) Map(1 -> "aa")
else if (a == 6) Array(1, 2, 3)
else if (a == 7) Array("aa", 1)
else if (a == 8) Array("aa")
val result = obj match {
  case a: Int => a
  case b: Map[String, Int] => "对象是一个字符串-数字的Map集合"
  case c: Map[Int, String] => "对象是一个数字-字符串的Map集合"
  case d: Array[String] => d //"对象是一个字符串数组"
  case e: Array[Int] => "对象是一个数字数组"
  case f: BigInt => Int.MaxValue
  case y: Float => println("xx")
  case _ => "啥也不是"
} 

4.匹配数组

Array(0)匹配只有一个元素且为0的数组。
Array(x,y)匹配数组有两个元素,并将两个元素赋值为x和y。当然可以依次类推Array(x,y,z)匹配数组有三个元素。
Array(0,_*)匹配数组以0开始。

scala> val arrs = Array(Array(0), Array(1, 0), Array(0, 1, 0), Array(1, 1, 0), Array(1, 1, 0, 1))
arrs: Array[Array[Int]] = Array(Array(0), Array(1, 0), Array(0, 1, 0), Array(1, 1, 0), Array(1, 1, 0, 1))

scala> :paste
// Entering paste mode (ctrl-D to finish)

 for (arr <- arrs ) {
       val result = arr match {
        case Array(0) => "0"
        case Array(x, y) => x + "=" + y
        case Array(0, _*) => "以0开头和数组"
        case _ => "什么集合都不是"
      }
      println("result = " + result)
   }

// Exiting paste mode, now interpreting.


        case Array(x, y) => x + "=" + y
                              ^
<pastie>:4: warning: method + in class Int is deprecated (since 2.13.0): Adding a number and a String is deprecated. Use the string interpolation `s"$num$str"`
result = 0
result = 1=0
result = 以0开头和数组
result = 什么集合都不是
result = 什么集合都不是
scala> val arrs2 = Array(Array(0), Array(1, 0), Array(0, 1, 0), Array(1, 1, 0), Array(1, 1, 0, 1))
arrs2: Array[Array[Int]] = Array(Array(0), Array(1, 0), Array(0, 1, 0), Array(1, 1, 0), Array(1, 1, 0, 1))

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> :paster
No such command ':paster'.  Type :help for help.

scala> :paste 
// Entering paste mode (ctrl-D to finish)

for (arr <- arrs2) {
      val result = arr match {
        //case Array(0) => "0"
        case Array(x, y) => ArrayBuffer(y, x) //Array(y,x).toBuffer //? ArrayB(y,x)
        //case Array(0, _*) => "以0开头和数组"
        case _ => "不处理~~"
      }
 
      println("res=" + result) //ArrayBuffer(0,1)
    }


// Exiting paste mode, now interpreting.

res=不处理~~
res=ArrayBuffer(0, 1)
res=不处理~~
res=不处理~~
res=不处理~~

scala> 

5.匹配列表

for (list <- Array(List(0), List(1, 0), List(0, 0, 0), List(1, 0, 0))) {
  val result = list match {
    case 0 :: Nil => "0" //
    case x :: y :: Nil => x + " " + y //
    case 0 :: tail => "0 ..." //
    case x :: Nil => x
    case _ => "something else"
  }
  //1. 0
  //2. 1 0
  //3. 0 ...
  //4. something else
  println(result)
}

6.匹配元组

    for (pair <- Array((0, 1), (1, 0), (10, 30), (1, 1), (1, 0, 2))) {
      val result = pair match { //
        case (0, _) => "0 ..." //
        case (y, 0) => y //
        case (x, y) => (y, x) //"匹配到(x,y)" + x + " " + y
        case _ => "other" //.
      }
      //1. 0 ...
      //2. 1
      //3. (30,10)
      //4. (1,1)
      //5. other
      println(result)
    }

7.对象匹配

8.变量模式匹配

val (x, y, z) = (1, 2, "hello")
println("x=" + x)
val (q, r) = BigInt(10) /% 3 //说明  q = BigInt(10) / 3 r = BigInt(10) % 3
val arr = Array(1, 7, 2, 9)
val Array(first, second, _*) = arr // 提出arr的前两个元素
println(first, second)

9.for表达式模式匹配

val map = Map("A" -> 1, "B" -> 0, "C" -> 3)
for ((k, v) <- map) {
  println(k + " -> " + v) // 出来三个key-value ("A"->1), ("B"->0), ("C"->3)
}
//说明 : 只遍历出 value =0 的key-value ,其它的过滤掉
println("--------------(k, 0) <- map-------------------")
for ((k, 0) <- map) {
  println(k + " --> " + 0)
}
 
//说明, 这个就是上面代码的另外写法, 只是下面的用法灵活和强大
println("--------------(k, v) <- map if v == 0-------------------")
for ((k, v) <- map if v >= 1) {
  println(k + " ---> " + v)
}
 

————Blueicex 2020/2/16 20:17 blueice1980@126.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值