Java scala模式匹配机制详解

 更新时间:2023年02月01日 14:05:07   作者:CarveStone  
模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断

模式匹配

Scala有一个十分强大的模式匹配机制,可以应用在很多场合:switch语句、类型查询,以及“析构”(获取复杂表达式的不同部分)。除此之外,Scala还提供了样例类,对模式匹配进行了优化。模式匹配类似于Java中的switch case语法,即对一个值进行条件判断,针对不同的条件进行不同的处理。

但是Scala的模式匹配的功能比Java的swtich case语法的功能要强大的多,Java的switch case语法只能对值进行匹配。Scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。

Scala使用match case语法进行模式匹配,语法如下:

变量 match{
    case 值1=> 代码
    case 值2 => 代码
    case  _ =>代码
}

如果值为下划线,则代表了不满足以上所有情况下的默认情况该如何处理,类似于Java中的default语句

使用类型匹配进行异常处理

异常处理是编程任务当中常常需要去解决的问题。简单来说,异常处理就是在程序运行当中出现问题时,用来打断程序执行的方式。而Scala当中,异常处理的实现与Java类似。

object LearnTypeMatch {
  def matchType(obj:Any): Unit = {
    obj match { //对类的类型进行匹配
      case int:Int => println("Int")  //如果obj对象是一个Int型变量,输出字符串
      case string:String => println("String") //如果obj对象是一个String型变量,输出字符串
      case map:Map[_,_] => map.foreach(println) //如果obj对象是一个Map型变量,遍历这个Map的所有元素
      case _ => println("other type") //如果上述类型均无法匹配,则输出字符串
    }
  }
  def main(args: Array[String]) {
    //声明四种类型的变量
    val int = 3
    val string = "hello scala"
    val map = Map("Alice" -> 10, "Bob" -> 3)
    val other = 3.5
    //将这四个变量传递给matchType函数
    matchType(int)
    matchType(string)
    matchType(map)
    matchType(other)
  }
}

如要对一段代码的执行进行异常检测,使用try将这段代码包起来,在catch语句中进行异常的匹配,借用了模式匹配的思想catch语句中是一系列的case字句。需要注意的是与try……catch成对出现的还有finally语句-用于执行不管是正常处理还是有异常发生时都需要执行的步骤。

object LearnExceptionMatch {
  def exceptionMatch(): Unit ={
    try{
      val i = 10/0  //这行代码显然是错的,在数学计算中,0是不能作为除数的,
      println(i)
    } catch {
      case e:ArithmeticException => println("Divisor cannot be zero") //判断异常的类型是不是ArithmeticException,如果是输出字符串
      case e:Exception => println(e.getMessage) //如果是其他异常则输出异常信息
    } finally {
      println("Hongya Scala") //输出一句话,由于这句话在finally结构中,因此肯定会执行。
    }
  }
  def main(args: Array[String]) {
    exceptionMatch
  }
}

使用样例进行模式匹配

Scala没有Java中的switch case,它有一个更加强大的模式匹配机制,可以应用到很多场合。

Scala的模式匹配可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。

模式匹配的基本语法结构:

变量 match { case 值 => 代码 }

模式匹配match case中,只要有一个case分支满足并处理了,就不会继续判断下一个case分支了,不需要使用break语句。这点与Java不同,Java的switch case需要用break阻止。如果值为下划线,则代表不满足以上所有情况的时候如何处理。

模式匹配match case最基本的应用,就是对变量的值进行模式匹配。match是表达式,与if表达式一样,是有返回值的。

object LearnCaseClass {
  def caseClassMatch(person:Person): Unit = {
    person match {
      case CTO(name,floor) => println("CTO name is: " + name + " , floor is: " + floor) //判断类是否是CTO类
      case Employee(name,floor) => println("Employee name is: " + name + " , floor is: " + floor) //判断类是否为Employee
      case _ => println("other")  //如果不满足上面的判断条件,输出字符串
    }
  }
  class Person  //声明一个类
  case class CTO(name:String, floor:String) extends Person  //声明CTO类
  case class Employee(name:String, floor:String) extends Person //声明Employee类
  case class Other(name:String) extends Person  //声明Other类
  def main(args: Array[String]) {
    //将三个变量带入
    caseClassMatch(CTO("PK", "22"))
    caseClassMatch(Employee("Zhang San", "2"))
    caseClassMatch(Other("other"))
  }
}

除此之外,Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

到此这篇关于Java scala模式匹配机制详解的文章就介绍到这了,更多相关Java scala模式匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 分位点(分位值)计算方式

    Java 分位点(分位值)计算方式

    这篇文章主要介绍了Java 分位点(分位值)计算方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Springboot 过滤器、拦截器、全局异常处理的方案处理小结

    Springboot 过滤器、拦截器、全局异常处理的方案处理小结

    拦截器是一种动态拦截方法调用的机制,与过滤器类似,是Spring框架中提供的,用来动态拦截控制器方法的执行,这篇文章主要介绍了Springboot 过滤器、拦截器、全局异常处理,需要的朋友可以参考下
    2024-03-03
  • Java对象以Hash结构存入Redis详解

    Java对象以Hash结构存入Redis详解

    这篇文章主要介绍了Java对象以Hash结构存入Redis详解,和Java中的对象非常相似,却不能按照Java对象的结构直接存储进Redis的hash中,因为Java对象中的field是可以嵌套的,而Redis的Hash结构不支持嵌套结构,需要的朋友可以参考下
    2023-08-08
  • Java RocksDB安装与应用

    Java RocksDB安装与应用

    本篇文章主要给大家介绍了JAVA中RocksDB的安装与应用,有需要到的朋友一起学习参考下。
    2017-12-12
  • Java Eureka探究细枝末节

    Java Eureka探究细枝末节

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的
    2022-09-09
  • 浅谈Maven镜像更换为阿里云中央仓库(精)

    浅谈Maven镜像更换为阿里云中央仓库(精)

    本篇文章主要介绍了Maven镜像更换为阿里云中央仓库(精),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Spring Boot 之HelloWorld开发案例

    Spring Boot 之HelloWorld开发案例

    这篇文章主要介绍了Spring Boot 之HelloWorld开发案例,需要的朋友可以参考下
    2017-04-04
  • Springboot创建项目的图文教程(idea版本)

    Springboot创建项目的图文教程(idea版本)

    这篇文章主要介绍了Springboot创建项目的图文教程(idea版本),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 详解elasticsearch之metric聚合实现示例

    详解elasticsearch之metric聚合实现示例

    这篇文章主要为大家介绍了elasticsearch之metric聚合实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Java构造器与传值学习总结

    Java构造器与传值学习总结

    这篇文章主要为大家详细介绍了Java构造器与传值学习总结,文中示例介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论