Scala的模式匹配----match

Scala的模式匹配----match

java 模式匹配可以匹配 :基本数据类型、字符串 、枚举

scala模式匹配可以匹配:基本数据类型、字符串、枚举、类型匹配、样例类

match: 按照顺序匹配,只匹配成功一次(前面匹配成功,后面的代码就不会执行了)

一 、模式匹配

1、匹配基本数据类型

object Demo27 {
  def main(args: Array[String]): Unit = {
    //定义一个变量,类型为基本数据类型
    val i = 100

    i match {
      case 100 => println("100")
      case 200 => println("2000")
      case _ => println("其它")
    }
 执行结果:
      	100

    //模式匹配可以有返回值
    //对变量i处理:奇数加一,偶数乘2
    val j: Int = i % 2 match {  //可以有返回值,那么接收一下
      case 1 => i + 1   //如果case匹配到1,说明是i是奇数,执行加1
      case 0 => i * 2   //如果case匹配到0,说明是i是偶数,执行乘2
    }
    println(j)  //200
  }
}

2、匹配类型

object Demo27 {
  def main(args: Array[String]): Unit = {
      //定义一个变量,不确定变量的类型,使用Any
      var str: Any = 12312.0

    //需要匹配的类型,只能是变量类型的子类型(Any是所有类型的父类型)
    str match {
      case s: String => println(s"字符串类型:$s")
      case i: Int => println(s"Int类型:$i")
      case _ => println(s"其它类型:$str")
    }
  }
}
        执行结果:
				其它类型:12312.0

3、匹配样例类

object Demo27 {
  def main(args: Array[String]): Unit = {
      
    //定义一个样例类
    case class User(id: String, name: String)
	//创建一个样例类对象
    val user = User("88", "张三")

    user match {
      case User("001", "张三") => println("张三")
      case User("002", "李四") => println("李四")
      case User("003", "王五") => println("王五")
      case i: User => println(i)	//如果匹配的是个对象,打印这个对象
      case _ => println("其它")
    }
  }
}
        执行结果:
                User(88,张三)

二、模式匹配应用案例

案例1

object Demo27 {
  def main(args: Array[String]): Unit = {
  
    //定义一个List集合,集合的元素是元组
    val list = List(("001", "张三", 23), ("002", "李四", 24), ("003", "王五", 25))

    //想要给年龄加1
    //使用map函数
    val list2: List[(String, String, Int)] = list.map(kv => {
      val id: String = kv._1  //id
      val name: String = kv._2  //name
      val age: Int = kv._3  //age
      (id, name, age + 1)
    })
    list2.foreach(println)
      
    //简写,map后面之间跟大括号{}
    //使用模式匹配
      //简写
    val list3: List[(String, String, Int)] = list.map {
      case (id: String, name: String, age: Int) => {
        (id, name, age + 1)
      }
    }

    list3.foreach(println)
  }
}

执行结果:
		(001,张三,24)
		(002,李四,25)
		(003,王五,26)

案例2:取出班级和年龄

object Demo27 {
  def main(args: Array[String]): Unit = {
      
  val students: List[String] = Source.fromFile("data/students.txt").getLines().toList

    val list4: List[Array[String]] = students.map(student => student.split(","))

    //前面切分的时候,返回的是一个数组
    //匹配数组
    val clazzAndAge: List[(String, String)] = list4.map {
      case Array(id: String, name: String, age: String, gender: String, clazz: String) => {

        (clazz, age)
      }
    }

    clazzAndAge.foreach(println)
  }
}

        执行结果:
                (文科六班,22)
                (文科六班,24)
                (理科六班,22)
                (理科三班,24)
                (理科五班,22)
                (理科二班,21)
                (文科六班,23)
                (理科六班,22)
                (理科一班,21)
                (理科六班,23)
                (理科三班,21)
                ...

案例3

package com.shujia.scala

object Demo28 {
  def main(args: Array[String]): Unit = {

    //定义一个Map集合
    val m = Map("001" -> "张三", "002" -> "李四")

    val name: String = m.getOrElse("001", "默认值")//传入的参数只会根据001,在Map集合中寻找对应的值
    println(name) //张三


    //使用getOrElse()需要传入两个参数;使用get()只需要传入一个key,返回的是Option类型
    val option1: Option[String] = m.get("001")
    println(option1)  //Some(张三)
    val option2: Option[String] = m.get("005")
    println(option2)  //None
    /**
     * Option: 是一个可选的值 (有值:Some , 没有值:None)
     */

    //get()的情况下,我们可以使用option来进行匹配
    val value: String = option1 match {
      case Some(v) => v
      case None => "默认值"
    }
    println(value)  //张三

  }
}
posted @   阿伟宝座  阅读(561)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示