Scala 匹配模式-高级用法

守卫语句的定义:

守卫语句是一个附加在case 语句后的布尔表达式,用于进一步筛选匹配条件。只有当match 的值满足 case 模式并且守卫语句的条件也为真时,该 case 分支才会被执行。

守卫语句的格式:

守卫语句紧跟在case 模式之后,通过 if 关键字引入,格式如下:

Scala 复制代码
value match{
    case pattern if guardCondition => result
    //其他 case 语句
}

其中,value 是要进行匹配的值,pattern 是匹配模式,guardCondition 是守卫条件(一个布尔表达式),result 是当该 case 分支匹配成功时返回的结果。

用户输入一个年份,判断是否是闰年:

Scala 复制代码
import scala.io.StdIn

object Test39 {
  def main(args: Array[String]): Unit = {
    //从控制台读入一个年份
    val year=StdIn.readInt()
    // 判断year是闰年
    // 1. year能整除4,不能整除100
    // 2. year能整除400

    year match {
      case x if(x%400==0) => println(s"$x 是闰年")
      case x if(x%4==0 && x%100 !=0) => println(s"$x 是闰年")
      case _ =>println(s"$year 不是闰年")
    }
  }
}

除了格式匹配之后,还可以对变量的类型进行匹配。格式如下:

Scala 复制代码
object Test40 {
  def main(args: Array[String]): Unit = {
    val i=1
    val j:Double=1.2
    val b:Boolean=false

    val x:Any=b
    x match {
      case _:Int=>println(s"当前是Int")
      case _:Double=>println(s"当前是Double")
      case a:Boolean=>println(s"当前是Boolean $a")
      case _=>println("其他")
    }
  }
}

匹配案例:

Scala 复制代码
object Test42 {
  case class Person(name:String)
  case class Student(name:String,className:String)

  // match case 能根据 类名和属性的信息,匹配到对应的类
  // 注意:
  // 1. 匹配的时候,case class 的属性个数要对上
  // 2. 属性名不需要一一对应
  def main(args: Array[String]): Unit = {
    val p1=Person("小花")
    val s1=Student("小明","2(3)班")
    
    val a:Any=p1
    a match {
      case Person(nm) => println("普通人类",nm)
      case Student(name,className) => println(className,"的学生",name)
      case _ => println("其他")
    }
  }
}
复制代码
需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值
Scala 复制代码
object Test42_1{
  //需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值
  def main(args: Array[String]): Unit = {
    val arr=Array(1,2,3,4)
    //第一个元素的值: arr(0)
//    println(arr(0))
//    var x =arr(0)
//    var y =arr(1)
//    var z =arr(2)
//    println(x,y,z)

    //有一个更简单的方式
    //模式匹配
    var Array(x,y,z,_*)=arr
    println(x)
    println(y)
    println(z)
  }
}
相关推荐
AI_小站1 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
笃行3501 小时前
向量数据库单独建一套,这笔账划不划算
后端
felixking2 小时前
C++20 协程
开发语言·c++·协程
weixin_431600442 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
Rain的Java大神之路2 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
Zane1994123 小时前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言
Lost of 程序猿3 小时前
AOP 实战:面向切面编程从理论到落地
后端·asp.net·aop·面向切片变成
Lost of 程序猿4 小时前
ASP.NET Core 认证授权实战:从 JWT 到 Policy,设计一套企业级 RBAC 权限系统
后端·asp.net
Lost of 程序猿4 小时前
ASP.NET Core 后台任务全景:从 BackgroundService 到 Channel 队列,再到分布式调度
后端·asp.net·.netcore
码农颜4 小时前
6.3 主函数流程剖析
开发语言·php