scala中的模式匹配和样例类

简介: scala有一个十分强大的模式匹配机制,可以应用到很多场合。java switch caseswitch语句类型查询以及快速获取数据并且scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

一、简介

scala有一个十分强大的模式匹配机制,可以应用到很多场合。java switch caseswitch语句类型查询以及快速获取数据并且scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

二、模式匹配

1、匹配字符串

//todo:匹配字符串
object CaseDemo01 extends App{
  //定义一个数组
  val arr=Array("hadoop","zookeeper","spark","storm")

  //随机取数组中的一位,使用Random.nextInt
  val name = arr(Random.nextInt(arr.length))
  println(name)

  name match {
    case "hadoop"     => println("大数据分布式存储和计算框架...")
    case "zookeeper"  => println("大数据分布式协调服务框架...")
    case "spark"      => println("大数据分布式内存计算框架...")
      //表示以上情况都不满足才会走最后一个
    case _            => println("我不认识你")
  }

}
2、匹配类型
//todo:匹配类型
object CaseDemo02 extends App{
  //定义一个数组
  val arr=Array("hello",1,-2.0,CaseDemo02)

  //随机获取数组中的元素
  val value=arr(Random.nextInt(arr.length))
  println(value)

    
  value match {
    case x:Int                => println("Int=>"+x)
    case y:Double if(y>=0)    => println("Double=>"+y)
    case z:String             => println("String=>"+z)
    case _                    => throw new Exception("not match exception")
  }

}
3、匹配数组
//匹配数组
object CaseDemo03 extends App{

  //匹配数组
  val  arr=Array(1,3,5)
  arr match{
    case Array(1,x,y) =>println(x+"---"+y)
    case Array(1,_*)  =>println("1...")
    case Array(0)     =>println("only 0")
    case _            =>println("something else")
      
  }
}
4、匹配集合
//匹配集合
object CaseDemo04 extends App{

  val list=List(0,3,6)
  list match {
    case 0::Nil        => println("only 0")
    case 0::tail       => println("0....")
    case x::y::z::Nil  => println(s"x:$x y:$y z:$z")
    case _             => println("something else")
  }
}    
5、匹配元组
//匹配元组
object CaseDemo05 extends App{
  
  val tuple=(1,3,5)
  tuple match{
    case (1,x,y)    => println(s"1,$x,$y")
    case (2,x,y)    => println(s"$x,$y")
    case _          => println("others...")
  }
}

二、样例类

样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),而且它会自动生成apply方法,允许我们快速地创建样例类实例对象==。后面在并发编程和spark、flink这些框架也都会经常使用它。定义样例类语法结构

case class 样例类名(成员变量名1:类型1, 成员变量名2:类型2 ...)

示例:

// 定义一个样例类
// 样例类有两个成员name、age
case class CasePerson(name:String, age:Int)

// 使用var指定成员变量是可变的
case class CaseStudent(var name:String, var age:Int)

object CaseClassDemo {
  def main(args: Array[String]): Unit = {
    // 1. 使用new创建实例
    val zhagnsan = new CasePerson("张三", 20)
    println(zhagnsan)

    // 2. 使用类名直接创建实例
    val lisi = CasePerson("李四", 21)
    println(lisi)

    // 3. 样例类默认的成员变量都是val的,除非手动指定变量为var类型
    //lisi.age = 22  // 编译错误!age默认为val类型

    val xiaohong = CaseStudent("小红", 23)
    xiaohong.age = 24
    println(xiaohong)
  }
}
1、样例对象

使用case object可以创建样例对象。样例对象是单例的,而且它没有主构造器。样例对象是可序列化的。格式:

case object 样例对象名

示例:

case class SendMessage(text:String)

// 消息如果没有任何参数,就可以定义为样例对象
case object startTask
case object PauseTask
case object StopTask
2、样例类和样例对象结合模式使用

示例:

case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask

object CaseDemo06 extends App{

  val arr = Array(CheckTimeOutTask,
                  HeartBeat(10000), 
                  SubmitTask("0001", "task-0001"))

  arr(Random.nextInt(arr.length)) match {
      
       case SubmitTask(id, name) => println(s"id=$id, name=$name")
       case HeartBeat(time) => println(s"time=$time")
       case CheckTimeOutTask => println("检查超时")

  }
}
7、Option类型

在Scala中Option类型用样例类来表示可能存在或也可能不存在的值Option类型有2个子类一个是SomeSome包装了某个值
在这里插入图片描述

一个是NoneNone表示没有值
在这里插入图片描述

示例:

object TestOption {
  def main(args: Array[String]) {
    val map = Map("a" -> 1, "b" -> 2)
      
    val value: Option[Int] = map.get("b")
    val v1 =value match {
      case Some(i) => i
      case None => 0
    }
    println(v1)

    //更好的方式
    val v2 = map.getOrElse("c", 0)
    println(v2)
  }
}

8、偏函数

被包在花括号内没有match的一组case语句是一个偏函数它是PartialFunction[A, B]的一个实例,A代表输入参数类型B代表返回结果类型可以理解为:偏函数是一个参数和一个返回值的函数。

示例:

object TestPartialFunction {
  // func1是一个输入参数为Int类型,返回值为String类型的偏函数
  val func1: PartialFunction[Int, String] = {
    case 1 => "一"
    case 2 => "二"
    case 3 => "三"
    case _ => "其他"
  }

  def main(args: Array[String]): Unit = {
    println(func1(1))
    
    val list=List(1,2,3,4,5,6)

    //使用偏函数操作
    val result=list.filter{
      case x if x >3 => true
      case _ => false
    }
    println(result)
  }

}
目录
相关文章
|
6月前
|
Scala
166 Scala 模式匹配和样例类
166 Scala 模式匹配和样例类
54 0
|
安全 Java 编译器
Scala快速入门-10-模式匹配与样例类
mathch表达式是一个更好的switch,不会有穿透到下一个分支的问题 如果没有模式能够匹配,会抛出MatchError,可以用case _ 模式来避免,相当于Java中的default 模式可以包含一个随意定义的条件,称做守卫 可以匹配数组、列表、元组等模式,然后将匹配到不同部分绑定到变量 样例类及密封类的模式匹配 用Option来存放可能存在也可能不存在的值,比null更安全
|
大数据 Java Scala
大数据Scala系列之模式匹配和样例类
大数据Scala系列之模式匹配和样例类1.样例类在Scala中样例类是一中特殊的类,样例类是不可变的,可以通过值进行比较,可用于模式匹配。定义一个样例类:1.构造器中每一个参数都是val,除非显示地声明为var 2.
832 0
|
SQL 消息中间件 分布式计算
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
711 0
如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
|
6天前
|
SQL 存储 分布式计算
在scala中使用spark
在scala中使用spark
7 0
|
6天前
|
分布式计算 Java Scala
spark 与 scala 的对应版本查看、在idea中maven版本不要选择17,弄了好久,换成11就可以啦
spark 与 scala 的对应版本查看、.在idea中maven版本不要选择17,弄了好久,换成11就可以啦
118 2
|
6天前
|
分布式计算 数据处理 Scala
Spark 集群和 Scala 编程语言的关系
Spark 集群和 Scala 编程语言的关系
36 0
|
6天前
|
分布式计算 Java Scala
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
|
12月前
|
存储 分布式计算 Scala
Spark-RDD 键值对的操作(Scala版)
Spark-RDD 键值对的操作(Scala版)