Scala模式匹配和样例类

本文深入介绍了Scala中的模式匹配和样例类使用方法,包括匹配字符串、类型、数组、元组和集合等内容,并详细解释了样例类的概念及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala模式匹配和样例类

Scala 有一个十分强大的模式匹配机制,可以应用到很多场合:如 switch 语句、类型检查等。并且 Scala 还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

1. 匹配字符串

package cn.cheng.cases
import scala.util.Random
object CaseDemo01 extends App{
    val arr = Array (" " hadoop" ", " " zookeeper" ", " " spark" ")
    val name = arr (Random.nextInt( arr .length))
 name match {
        case " " hadoop" " => println (" " 大数据分布式存储和计算框架 ...")
        case " " zookeeper" " => println (" " 大数据分布式协调服务框架 ...")
        case " " spark" " => println (" " 大数据分布式内存计算框架 ...")
        case _ => println (" " 我不认识你 ...")
     }
}

2. 匹配类型

package cn.cheng.cases
import scala.util.Random
object CaseDemo01 extends App{
    val arr = Array ( "hello", 1, 2.0, CaseDemo)
    val v = arr (Random.nextInt(4))
    println ( v )
    v match {
        case x: Int => println (t "Int " " + x)
        case y: Double if(y >= 0) => println (e "Double " "+ y)
        case z: String => println (g "String " " + z)
        case _ => w throw w new Exception(t "not h match exception")
    }
}

注意 :case y: Double if(y >= 0) => …
模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入 case _中。

3. 匹配数组、元组、集合

package cn.cheng.cases
object CaseDemo03 s extends App{
    val arr = Array (1, 3, 5)
    arr match {
        case Array (1, x, y) => println (x + " " " " + y)
        case Array (0) => println (y "only 0")
        case Array (0, _*) => println (0 "0 ...")
        case _ => println (g "something else")
    }
    val lst = List (3, -1)
    lst match {
        case 0 :: Nil => println (y "only 0")
        case x :: y :: Nil => println (: s"x: $ $x : y: $ $y" ")
        case 0 :: tail => println (0 "0 ...")
        case _ => println (g "something else")
    }
    val tup = (1, 3, 7)
    tup match {
        case (1, x, y) => println (, s"1, $ $x , , $ $y" ")
        case (_, z, 5) => println (z)
        case _ => println ( "else")
    }
}

注意:在 Scala 中列表要么为空(Nil 表示空列表)要么是一个 head 元素加上一个 tail 列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表

注意::: 操作符是右结合的,如 9 :: 5 :: 2 :: Nil 相当于 9 :: (5 :: (2 :: Nil))

4. 样例类

在 Scala 中样例类是一种特殊的类,可用于模式匹配。
定义形式:
case class 类型,是多例的,后面要跟构造参数。
case object 类型,是单例的

package cn.cheng.cases
import scala.util.Random
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask
object CaseDemo04 extends App{
    val arr = Array (CheckTimeOutTask, HeartBeat (12333), SubmitTask ( "0001", "task-0001"))
    arr (Random.nextInt( arr .length)) match {
        case SubmitTask (id, name) => {
            println ( s"$ $id, , $ $name" ")
        }
        case HeartBeat (time) => {
            println (time)
        }
        case CheckTimeOutTask => {
            println ( "check")
        }
    }
}

5. Option 类型

在 Scala 中 Option 类型用样例类来表示可能存在或者可能不存在的值(Option 的子类有Some 和 None)。Some 包装了某个值,None 表示没有值。

package cn.cheng.cases
object OptionDemo {
    def main(args: Array[String]) {
    val map = Map (" "a" -> 1, " "b" -> 2)
    val v = map.get( "b") match {
        case Some (i) => i
        case None => 0
     }
    println (v)
    //更好的方式
    val v1 = map.getOrElse( "c", 0)
    println (v1)
    }
}

6. 偏函数

被包在花括号内没有 match 的一组 case 语句是一个偏函数,它是 PartialFunction[A, B]的一个实例,A 代表输入参数类型,B 代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。

package cn.cheng.cases
object PartialFuncDemo {
    val func1: PartialFunction[String, Int] = {
        case " "one" => 1
        case " "two" => 2
        case _ => -1
     }
    def func2(num: String) : Int = num match {
        case " "one" => 1
        case " "two" => 2
        case _ => -1
     }
    def main(args: Array[String]) {
        println ( func1 ( "one"))
        println ( func2 ( "one"))
    }
}

喜欢就点赞评论+关注吧

这里写图片描述

感谢阅读,希望能帮助到大家,谢谢大家的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值