scala- 模式匹配

scala- 模式匹配

模式匹配

scala 中的 match(代替 java 中的 switch ,但更加强大)

  • 语法格式

  • 需要匹配的对象 match{
    case 值1 => 匹配成功操作
    case 值2 => 匹配成功操作
    case _ => 如果上面的都没有匹配 执行当前操作(相当于 default )
    }

  • match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。

值匹配

	var sign = 0
    val ch = 'c'
    ch match {
      case 'a' => sign = 1
      case 'b' => sign = 2
      case _ => sign = 3
    }
    println(sign)
    // 3

集合中元素匹配

//集合匹配
    for (ch <- "xy23!") {
      var sign = 0
      ch match {
        case 'x' => sign = 1
        case 'y' => sign = 2
        // 加入守卫
        case _ if Character.isDigit(ch) => sign = Character.digit(ch, 10)
        case _ => sign = 9
      }
      print(sign + "\t")
    }
    //1	2	2	3	9

添加临时变量

//利用下标迭代
    val str = "+-3!"
    for (i <- str.indices) {
      var sign = 0
      var digit = 0

      str(i) match {
        case '+' => sign = 1
        case '-' => sign = -1
          //添加临时变量,此时ch1=str(i)
        case ch1 if Character.isDigit(ch1) => digit = Character.digit(ch1, 10)
        case _ =>
      }

      println(str(i) + " " + sign + " " + digit)
    }
  }

匹配类型

  • 需求
    如果是int +1
    如果是String *2
    如果是Double +3
val list: List[Any] = List(1, '2', 3.0, "4")
    for (i <- list) {
      var res = i match {
        case i: Int => i + 1
        case i: String => i * 2
        case i: Double => i + 3
        case _ => 0
      }
      print(res + "\t")
    }
    //2	0	6.0	44

数组匹配

for (arr <- Array(
      Array(2, 3),
      Array(0),
      Array(1, 0),
      Array(0, 1, 0),
      Array(1, 1, 0),
      Array(3)
    )) {
      val result = arr match {
        //代表数组中有且仅有三个元素可以匹配到,可以重复
        case Array(a, b, c) => a + b + c
        //代表1开头的数组可以匹配
        case Array(1, _*) => "1 ..."
        //同第一条
        case Array(x, y) => x + " " + y
        //同第二条
        case Array(0, _*) => "0 ..."
        case Array(0) => "0"
        //代表其他
        case _ => "something else"
      }
      println(result)
      /*
      2 3
      0 ...
      1 ...
      1
      2
      something else
      */
    }

元组匹配

for (arr <- Array(
      (0, 1),
      (1, 0),
      (2, 0),
      (1, 1)
    )) {
      var res = arr match {
      	// _ 充当占位符  或者理解成匹配任意元素
        case (0, _) => "0 ..."
        case (y, 0) => y + " " + 0
        case _ => "other"
      }
      print(res + "\n")
    }
     /*
        0 ...
        1 0
        2 0
        other
      */

集合匹配

for (lst <- Array(
      List(0),
      List(1, 0),
      List(2, 3),
      List(0, 0, 0), //  List(0, 0, 0)=0 :: List(0,0)
      List(0, 'a', "b"),
      List(1, 0, 0)
    )) {
      val result = lst match {
        //匹配以0开始,空集合结束,即集合中只有0
        case 0 :: Nil => "0"
        //匹配有两个元素,空集合结束
        case x :: y :: Nil => x + " " + y
        //匹配以0开始,后面不限,xxx变量名任意
        case 0 :: xxx => xxx
        case _ => "something else"
      }
           println(result)
    }
     /*
        0
        1 0
        2 3
        List(0, 0)
        List(a, b)
        something else
      */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值