Scala之模式匹配与隐式转换

这篇具有很好参考价值的文章主要介绍了Scala之模式匹配与隐式转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Scala之模式匹配与隐式转换

目录

模式匹配:

基础语法如下:

模式守卫:

类型匹配:

对象匹配

样例类:

偏函数:

偏函数的化简写法:

偏函数的使用:

隐式转换:

官方定义:

个人理解:

隐式函数:

隐式转换的步骤:

隐式参数:

参数对比样例:

隐式类:


模式匹配:

Scala中的模式匹配相当于Java中的switch

在Java中我们有switch  case default 这三个组成的基础语法,在Scala中我们是有match  和 case组成  default的作用由case代替

基础语法如下:

val a=10
    val b=20
    var c='+'
    c match {
      case '+'=> println(a+b)
      case '-'=> println(a-b)
      case _  =>println("错误的运算符")
    }

在Scala中是默认从这个case执行到下一个case的  

case _  是代表上述情况都不满足

模式守卫:

如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫
(其实是在case中添加if判断)
 val x=3.153
    val value: Any = x match {
      case i: Double if i >= 0 => i
      case j: Double if j < 0 => -j
      case _ => "type illegal"
    }

类型匹配:

在定义函数时 参数为所有对象的父类Any

 def function(x:Any): Unit ={
      x match {
        case s:String =>println("字符串")
        case i:Int=>println("整数")
        case d:Double=>println("小数")
        case _ =>println("其他")
      }
    }

对象匹配

对象的匹配是比较复杂的,单纯的比较是比较的地址值,两个变量的地址值是肯定不同的

object Test_03MatchObject {
  def main(args: Array[String]): Unit = {
    val sss: person1 = person1("sss", 1)
  sss match {
    case person1("sss",1)=>println("victory")
    case _=>println("defite")
  }
  }
  class person1(val name: String,val age :Int){
  }
  object person1{
    def apply(name: String, age: Int): person1 = new person1(name, age)
    def unapply(arg: person1): Option[(String, Int)] =
      if (arg==null)
      {
        None
      }
      else{
        Some(arg.name,arg.age)
      }  }
}

这里我们在object中定义了unapply方法   unapply方法相当于apply方法的逆应用,apply方法是在object中创建对象,而unapply方法是提取方法,提取操作的对象(传入的参数为对象,根据对象进行提取数据存入Some,与自己的传入的数据进行比较)这个方法也是和apply方法一样不用写方法名。

该方法主要用于解析对象(匹配对象)

样例类:

样例类中的主属性默认为val如果需要使用var则需要自己标注

样例类会自动生成unapply与apply等方法   节省了大量代码

把上述的class与object注释后新建样例类:(大量使用)

  case class person1(val name: String,val age :Int)

偏函数:

偏函数的化简写法:

我们可以直接调用collect函数进行调用偏函数参数直接写case+你需要的操作

化简写法相当于省掉了match,作用相当于 filter+map

在使用map的场景下也能使用偏函数

偏函数的使用:

    val list = List(List(1, 2, 3, 4), List(1), List(8, 5))
    val list1: List[Int] = list.collect({ case List(x, y, _*) => y })
  println(list1)

隐式转换:

官方定义:

当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用

于将类型进行转换,实现二次编译

个人理解:

隐式转换是我们在对一个对象调用它所在的类中没有的函数时发生错误所进行的操作

隐式函数:

隐式转换的步骤:

(1)需要现在下边定义一个目标类  在类中定义所调用的方法与逻辑

eg:我们对Int类型数据调用一个不存在的方法:
 

class MyRichInt(val self :Int)
  {
def myMax(int: Int):Int =
    {
      if (int>self)
        int
        else
        self
    }
  }

(2)在main函数中定义转换器

在开头要引入 ----   implicit 隐式转换的函数再进行定义

 implicit def changeInt(self:Int)  =
    {
new MyRichInt(self)
    }

当隐式转换的的方法相同与自身方法冲突,会使用自身的方法(因为不会编译失败---隐式转换的官方定义)

隐式参数:

在定义函数时我们已经知道了参数默认值  但是调用的时候我们需要加上括号

在这里我们引入了新概念   隐式参数

参数对比样例:

   implicit val name:String="lisi"
    def sayhi(implicit name: String="sd"): Unit =
    {
      println(s"hi $name")
    }
   sayhi
   sayhi()

参数默认值只是在调用函数的后边加一个括号

运行结果:

Scala之模式匹配与隐式转换

隐式类:

在普通类的前面添加关键字implicit会自动转换成隐式类

如果隐式转换的目标类转换成隐式类 则不需要在main函数中new隐式类的

可以直接调用指定函数

Scala至此终结!!!!!文章来源地址https://www.toymoban.com/news/detail-441127.html

到了这里,关于Scala之模式匹配与隐式转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Scala-模式匹配

    类似于java中switch 当数据满足某一个分支时,执行完毕后,就直接跳出 case分支类似于default语言, 分支匹配其实就是顺序匹配 如果数据没有匹配任何规则,会发生错误 类型前增加变量名称,这个变量就是将数据转换成指定类型的变量 如果想要使用下划线代表的数据,可以给下

    2024年01月20日
    浏览(27)
  • Scala的模式匹配

    Scala 中的模式匹配类似于Java 中的 switch 语法:下面是java中switch代码: 但是 scala 从语法中补充了更多的功能,所以更加强大。 模式匹配语法中,采用 match 声明,每个分支采用 case 进行声明,当需要匹配时,会从第一个 case 分支开始,如果匹配成功,那么执行对

    2024年02月10日
    浏览(27)
  • Scala编程基础:表达式、函数、模式匹配与集合操作

    本文详细介绍了Scala编程的基础知识,包括表达式的使用,方法与函数的区别,模式匹配的各种模式,以及Scala Trait(特质)的定义和使用。

    2024年04月14日
    浏览(49)
  • Scala隐式参数提示 找不到参数的隐式 报错ambiguous implicit values:

    这个问题纯属被一个博客给坑了,Scala的隐式查找是按照类型查找的,例如这里的x是Int,y是Int,那么编译器就不知道你要传入的是哪个,哪怕你把参数都x,y这些名称都对应也不行。 解决方法很简单,同类型的隐式参数唯一即可 不知道是另有原因还是什么,有些博主写博客真就

    2024年03月19日
    浏览(40)
  • MySQL隐式类型转换

    当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。 如果一个或两个参数都为 NULL ,则比较结果为 NULL 。但是相等比较运算符 = 除外,对于 NULL=NULL ,结果为1,不需

    2023年04月23日
    浏览(44)
  • 『C语言』隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月12日
    浏览(34)
  • JS隐式转换与类型比较

    隐式转换(Implicit Conversion)是指在表达式求值或操作中自动发生的类型转换。当使用不同的数据类型进行操作时,JavaScript 会自动进行类型转换以满足操作的要求。 隐式转换在编写逻辑时经常会出现,特别是在需要进行判断的逻辑场景中。举个例子: 需要注意的是,隐式转

    2024年02月07日
    浏览(30)
  • 『C语言进阶』隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月10日
    浏览(43)
  • MySQL 的隐式转换导致诡异现象的案例一则

    正是因为 MySQL 对字符串进行隐式转换时会截断再转,而不是像 Oracle、SQL Server 这些数据库针对这种问题直接报错,所以才出现了这个诡异的问题。 作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Or

    2024年02月10日
    浏览(42)
  • 『C语言初阶』第八章 -隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包