【Scala】模式匹配与Option类型

目录

模式匹配

简单模式匹配

匹配类型

守卫

匹配样例类

Option类型


  • 模式匹配

scala中有一个非常强大的模式匹配机制,可以应用在很多场景:

1.switch语句

2.类型查询

3.使用模式匹配快速获取数据

 

简单模式匹配

在Java中,有switch关键字,可以简化if条件判断语句。在scala中,可以使用match表达式替代。

格式:

变量 match {
    case "常量1" => 表达式1
    case "常量2" => 表达式2
    case "常量3" => 表达式3
    case _ => 表达式4                        // 默认匹配
}

例:

//创建输入对象 StdIn.readLine表示从控制台读取一行文本
var datas = StdIn.readLine()

//模式匹配
datas match {
  case "hadoop" => println("这是hadoop")
  case "spark" => println("这是spark")
  case "kafka" => println("这是kafka")
  case _ => println("这是大数据")
}

 

匹配类型

除了像Java中的switch匹配数据之外,match表达式还可以进行类型匹配。如果我们要根据不同的数据类型,来执行不同的逻辑,也可以使用match表达式来实现

格式:

变量 match {
   case 类型1的变量名: 类型1 => 表达式1
   case 类型2的变量名: 类型2 => 表达式2
   case 类型3的变量名: 类型3 => 表达式3
  ...
   case _ => 表达式4
}

例:

//创建变量 String类型 Any为String父类
var a: Any = "hive"

//对变量进行匹配
a match {
  case _: String => println("字符串")
  case _: Int => println("s数值")
  case _: Double => println("浮点型")
  case _ => println("什么也不是")
}

 

守卫

在scala中,可以使用守卫来在case语句中添加if条件判断

例:

//创建输入对象 StdIn.readLine表示从控制台读取一行文本
val a = StdIn.readInt()

//模式匹配
a match {
    case _ if a >= 0 && a <= 3 => println("[0-3]")
    case _ if a >= 4 && a <= 8 => println("[3-8]")
    case _ => println("未匹配")
}

 

匹配样例类

scala可以使用模式匹配来匹配样例类,从而可以快速获取样例类中的成员数据。

例:

//创建样例类
case class Person(name: String, age: Int)

case class Order(id: String)

def main(args: Array[String]): Unit = {
  //建样例类对象,并赋值为Any类型
  val zhangsan: Any = Person("张三", 20)
  val order1: Any = Order("001")

  //模式匹配
  order1 match {
    case Person(name, age) => println(s"姓名:${name} 年龄:${age}")
    case Order(id) => println(s"ID为:${id}")
    case _ => println("未匹配")
  }

}

 

  • Option类型

使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。

 

例:

//Some(x):表示实际的值
//None:表示没有值
def dvi(a: Double, b: Double) = {
  if (b != 0) {
    //表示实际的值
    Some(a / b)
  } else {
    //表示没有值 返回None
    None
  }
}

def main(args: Array[String]): Unit = {
  var num = dvi(10,0)
  
  //模式匹配
  num match {
  case Some(a) => println(a)
  case None => println("??") 
  }
  
  //找到指定值如果不存在返回指定值
  //println(num.getOrElse("?????"))
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值