一次说清scala-spark中的模式匹配,样例类以及option

目录目录

前言

一、模式匹配是什么?

二、模式匹配案例

1.简单模式匹配

2.类型模式匹配

3.样例类模式匹配

样例类是什么?

样例类的模式匹配

4.option类



前言

 在spark中scala的模式匹配是重要的功能,它大量体现在spark的源码之中,它的作用与Java中的switch语句相似

一、模式匹配是什么?

模式匹配就是Java中的switch语句,如果能够匹配的上,就会执行case的语句,如果匹配不上,就会默认匹配case_,相当于Java中的默认值,与switch不同的一点是它可以匹配类型

二、模式匹配案例

1.简单模式匹配

object scala01 {
  def main(args: Array[String]): Unit = {
/*
使用match进行简单模式匹配
*/
    for (i <- 1 to 5) {
//随机取0-3
      val index = Random.nextInt(5)
      val test: String = index match { 
        case 1 => "apple"
        case 2 => "egg"
        case 3 => "pp"
        case _ => "none" //相当于默认值
      }
      println("index:" + index + " res:" + test)
    }
  }
}

结果为:

index:3 res:pp
index:0 res:none
index:1 res:apple
index:0 res:none
index:0 res:none

2.类型模式匹配

 def main(args: Array[String]): Unit = {
    /*
    类型模式匹配
    */
    for (value <- List(9, 12.3, "Spark", "Hadoop", 'Hello)) {

      val str = value match {
        case i: Int => i + "是整型数据"
        case d: Double => d + "是浮点型数据"
        case "Spark" => "我是Spark"
        case s: String => s + "是字符串"
        case _ => "This is an unexpected value."
      }
      println(str)
    }
  }

结果是:

9 是整型数据
12.3 是浮点型数据
我是Spark
Hadoop 是字符串
This is an unexpected value.

3.样例类模式匹配

样例类是什么?

样例类也被称作case类,它与普通类相似,但是,当一个类被定义成为case类后,Scala会自动帮你实现一些函数,它就相当于经过优化的类

 定义方法如下:

case class 样例类名称(属性:类型,属性:类型,属性:类型....)

样例类的模式匹配

  def main(args: Array[String]): Unit = {
    /*
  样例类模式匹配
   */
    //定义样例类
    case class phone(brand: String, price: Int)
    //对样例类赋值
    val hw = new phone("华为", 1000)
    val sx = new phone("三星",1100)
    val pg = new phone("苹果", 1110)
    val xlt = new phone("小灵通", 1111)

    for (car <- List(hw, sx, pg,xlt)) {
      car match {
        case phone("华为", 1000) => println("我是华为")
        case phone("三星",1100) => println("我是三星")
        case phone(brand, price) => println("我是:" + brand + " 我的价格为:" + price)
      }
    }
  }

结果为:

我是华为
我是三星
我是:苹果 我的价格为:1110
我是:小灵通 我的价格为:1111

4.option类

标准类库中的 Option 类型用 case 类来表示那种可能存在、也可能不存在的值。
一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引用的是“无”,在 Java 中使用的是 null Scala 融合了函数式编程风格,因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建议你使用 Option 类型。
Option 类包含一个子类 Some ,当存在可以被引用的值的时候,就可以使用 Some 来包含这个值,例如 Some("Hadoop") None 则被声明为一个对象,而不是一个类,表示没有值

 option类可能有些抽象,所以使用代码来进行解释

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

    //首先创建一个字典类型的数据并且赋值
    val value = Map("age" -> 10, "name" -> "pp", "grade" -> 100)

    //从value中取出key为age的值,这个键是存在的,所以可以取出,取到的值在some中
    val age: Option[Any] = value.get("age")

    //value中并没有包含height这个键,所有这个取不到,只能取到none对象
    val height: Option[Any] = value.get("height")

    //还可以使用getOrElse方法
    // 在Option是Some的实例时返回对应的值,而在是None的实例时返回传入的参数

    val name: Option[Any] = value.get("name")
    val name1: Any = name.getOrElse("皮")

    val weight: Option[Any] = value.get("weight")
    val wg: Any = weight.getOrElse("60公斤")


    for (i <- List(age, height, name1,wg)) {
      println(i)
    }
  }

 结果是:

Some(10)
None
pp
60公斤

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值