scala模式匹配,元组

10 篇文章 0 订阅
4 篇文章 0 订阅
本文详细介绍了Scala语言中的模式匹配机制,包括基本的switch-like语法,模式守卫,匹配常量,类型判断,数组,列表,元组以及样例类的匹配。展示了如何在不同场景下灵活运用模式匹配进行条件判断和数据处理。
摘要由CSDN通过智能技术生成

scala模式匹配类似于java中的switch语法

基本语法

模式匹配语法中,采用 match 关键字声明,每个分支采用 case 关键字进行声明,当需要匹配时,会从第一个 case 分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有 case 都不匹配,那么会执行 case _分支,类似于 Java 中 default 语句
def match(x:Int):String={
    x match {
      case 1=>"one"
      case 2=>"two"
      case _=>"other"
    }
  }
println(d)           //other

一,模式守卫

如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫
    println("===模式守卫============")
    def match(num:Int):Int ={
      num match {
        case i if i >= 0 => i
        case i if i < 0 => -i
      }
    }

    println(match2(90))        // 90
    println(match20(-34))      // 34

二,匹配常量

Scala 中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等
def match(x:Int):String={
    x match {
      case 1=>"one"
      case 2=>"two"
      case _=>"other"
    }
  }

println(1)   //one

三,匹配类型

需要进行类型判断时,可以使用前文所学的 isInstanceOf[T]和 asInstanceOf[T],也可使 用模式匹配实现同样的功能。
def match(x:Any):Unit={
    x match {
      case 1=>println("内容为1")
      case a:Int=>println("内容类型为整型,值为:"+a)
      case s:String=>println("这是一个字符串,内容为:"+s)
      case _=>println("不知道是什么")
    }
  }

println(1)   //内容为1

四,匹配数组

scala 模式匹配可以对集合进行精确的匹配,例如匹配只有两个元素的、且第一个元素为 0 的数组
    for (arr <-List(
      Array(0),
      Array(1,0),
      Array(0,1,0),
      Array(4,8,9,23),
      Array("hello",20,30),
    )){
      val result =arr match {
        case Array(0) =>"0"
        case Array(1,0) =>"Array(1,0)"
        case Array(x,y) =>"Array:"+ x +" ," + y //匹配两元素数组
        case Array(0,_*) =>"以0开头的数组"
        case Array(x,1,z) =>"中间为1的三元数组"
        case _ =>"something else"
      }
      println(result)
    }

五,匹配列表

for (list <- List(
      List(0),
      List(1, 0),
      List(0, 0, 0),
      List(1, 1, 0),
      List(88),
      List("hello")
    )) {
      val result = list match {
        case List(0) => "0"
        case List(x, y) => "List(x,y):" + x + "," + y
        case List(0, _*) => "List(0,....)"
        case List(a) => "List(a):" + a
        case _ => "something else"
      }
      println(result)
    }

六,匹配元组

   for (tuple <- List(
      (0, 1),
      (0, 0),
      (0, 1, 0),
      (0, 1, 1),
      (1, 23, 65),
      ("hello", "scala", 111)
    )) {
      val result = tuple match {
        case (a, b) => "" + a + "," + b
        case (0, _) => "(0,_)"
        case (a, 1, _) => "(a,1,_)" + a
        case _ => "something else"
      }
      println(result)
    }

七,匹配样例类

def match(teacher:Teacher):Unit={
    teacher match {
      case Teacher("zhangsan",39)=>println("hi zhangsan")
      case Teacher("lisi",18)=>println("hi lisi")
      case Teacher(name,age)if (name=="wangwu"&& age==45)=>println("优秀")
      case x:Teacher=>println("hello "+x.name)
    }
  }
  //样例类
  case  class Teacher(name:String,age:Int)

 match(Teacher("zhangsan",39))  //hi zhangsan

元组

元组只有22个;swap方法只有tuple2中才有,指交换两个元素的位置

val tuple: (String, Int, Boolean) = Tuple3("hello", 1, true)
    println(tuple)      //(hello,1,true)
    println(tuple._3)   //true

 val tuple1: (Int, String) = Tuple2(8, "name")
    println(tuple1.swap)  //(name,8)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值