范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

详解Scala模式匹配

  本篇博客中我们将采用类似的方法,并熟悉Scala编程语言的另一个重要特性—模式匹配。同样我们将通过编写一些简短的代码片段,一系列小步骤来逐步深入。
  我们首先声明一个非常简单的case类,后面将对其详细剖析case class FullName(first: String, last: String)
  case 类的许多其他有用特性(例如结构化 equals、hashCode、copy 和 toString)中,Scala 编译器支持以下代码val me = FullName("Linas", "Medžiūnas")
  val FullName(meFirst, meLast) = me
  //meFirst: String = Linas
  //meLast: String = Medžiūnas
  请注意这里的一个很好的对称性:构造时me 在左侧,带有两个字符串参数的 FullName(...)在赋值的右侧,解构时正好相反。
  当谈到 Scala 模式匹配时,首先想到的是 match 语句(它类似于许多其他编程语言中的 switch / case,但是更强大)。可以在 Scala 中的很多地方可以使用模式匹配:你可以在定义 lambda 函数时使用它,也可以在 for-comprehension 生成器的左侧,甚至在上面例子中的赋值语句中。为简单起见,在本文的其余部分,我们将主要在赋值语句中使用模式匹配。
  现在我们已经定义了case类以及一些使用它的代码,接着尝试了解 Scala case类的特别之处以及如何使用相关代码。有时理解某事物如何工作的一个非常好的方法是破坏它,然后尝试使其再次工作!先将 FullName类定义的 case 关键字排除/*case*/ class FullName(first: String, last: String)
  如果尝试上述代码,会发现代码(value me 的构建和它的解构)编译报错。为了修复它,我们需要在事情开始崩溃之前手动实现 Scala 编译器之前提供给我们的功能,我们为 FullName类添加一个伴随对象object FullName {
  def apply(first: String, last: String): FullName =
  new FullName(first, last)
  def unapply(full: FullName): Some[(String, String)] =
  Some((full.first, full.last))
  }
  Scala 中的伴生对象是一个单例,与它的伴生类同名且在同一个文件中。而且伴随对象和它的类可以访问彼此的私有成员。伴生对象是放置类的静态成员的地方(与 Java 不同,Scala 没有 static 修饰符),这提供了更清晰的静态/实例成员分离。
  注意:我们必须稍微更改 FullName类定义,以使FullName.unapply编译成功/*case*/ class FullName(val first: String, val last: String)
  如果不进行修改,first 和 last 只会作为构造函数的参数,无法通过 unapply访问它们。在 first 和 last 之前添加 val 会将它们同时转换为构造函数参数和实例字段(默认为 public)。在我们删除 case 关键字之前Scala 编译器会自动为我们生成此功能以及伴随对象。
  现在手动添加所有这些代码可以修复编译问题,继续让我们深入了解刚刚实现的两个方法的细节def apply(first: String, last: String): FullName
  apply 是 Scala 中的一个特殊方法名称,按照约定可以在代码中省略,所以FullName(...)等价于FullName.apply(...),我们正在使用它来构造FullName的新实例,而无需 new 关键字。def unapply(full: FullName): Some[(String, String)]
  unapply 正好相反——它解构了一个 FullName的实例,并且是模式匹配的基础,接下来我们将重点介绍这种方法,在这种情况下,它将FullName解构为两个字符串值,并将它们包装在 Some 中,这意味着它可以匹配FullName的任何实例(稍后我们将探讨部分匹配partial matching)。
  再次注意这两个方法的对称性:apply将两个字符串作为参数,并返回一个FullName的实例。而unapply则恰好相反。
  现在我们对什么是 unapply 以及它如何用于解构/模式匹配有了一个非常基本的了解。在大多数情况下,它已经由 Scala 处理—— unapply 的实现不仅为我们编写的所有case类提供,而且为几乎所有 Scala 标准库中的所有内容提供,包括集合(如果适用),事实上实现自己的 unapply并不常见,除非你是某个有趣库的开发者,然而我们可以作弊—在Java中unapply 肯定不存在,让我们从 java.time 中获取一些类,并在它们上添加对 Scala 模式匹配的支持import java.time.{LocalDate, LocalDateTime, LocalTime}
  能够将 Date 分解为年、月和日,将 Time 分解为小时、分钟和秒,这很自然。此外DateTime — 转换为日期和时间,根据我们已有的知识,这非常简单。但是我们不能使用名称 LocalDate、LocalDateTime 和 LocalTime 来创建合适的伴生对象,因为伴生对象需要与对应的类放在相同的文件,但由于这些类来自 Java 标准库,因此不可能。为了避免名称冲突,我们简单地将实现对象的名称中省略 Localobject DateTime {
  def unapply(dt: LocalDateTime): Some[(LocalDate, LocalTime)] =
  Some((dt.toLocalDate, dt.toLocalTime))
  }
  object Date {
  def unapply(d: LocalDate): Some[(Int, Int, Int)] =
  Some((d.getYear, d.getMonthValue, d.getDayOfMonth))
  }
  object Time {
  def unapply(t: LocalTime): Some[(Int, Int, Int)] =
  Some((t.getHour, t.getMinute, t.getSecond))
  }
  接着使用它们:val Date(year, month, day) = LocalDate.now
  val Time(hour, minute, second) = LocalTime.now
  LocalDate 和 LocalTime 都按照预期被解构为 3 个 Int 值。如果我们只需要一些解构的值而不需要其他值,可以使用下划线代替那些不需要的值val Date(_, month, day) = LocalDate.now
  一个更有趣的例子是 LocalDateTime 的嵌套解构val DateTime(Date(y, m, d), Time(h, mm, s)) = LocalDateTime.now
  这为我们提供了 6 个 Int 值(日期部分为 3,时间部分为 3)。
  模式匹配的另一个非常有用的特性是整个值的赋值,这可以在解构之外完成。对于我们的 DateTime 示例,它可能如下所示val dt @ DateTime(date @ Date(y, m, d), time @ Time(h, mm, s)) =
  LocalDateTime.now
  除了 6 个 Int 值,还得到一个 LocalDate 值,一个是 LocalTime 值,最后是 LocalDateTime 的整个值(以 dt 为单位)。
  在上面的所有示例中,我们都解构为固定数量的值——(年、月、日)、或(时、分、秒)或(日期、时间)。在某些情况下我们需要处理一系列值,而不是某些固定数量的值,可以尝试通过将 LocalDateTime 解构为一系列 Intobject DateTimeSeq {
  def unapplySeq(dt: LocalDateTime): Some[Seq[Int]] =
  Some(Seq(
  dt.getYear, dt.getMonthValue, dt.getDayOfMonth,
  dt.getHour, dt.getMinute, dt.getSecond))
  }
  unapplySeq是unapply的变体,它解构为一系列值而不是固定大小的元组。在这个例子中,序列的长度总是 6,但可以省略它的尾部,因为不需要它val DateTimeSeq(year, month, day, hour, _*) = LocalDateTime.now
  _*是 Scala varargs 的语法
  到现在为止,unapply / unapplySeq总是返回 Some。为此unapply将返回Some以防该值符合某些条件,而None则不符合。我们已经在处理 LocalTime 的值,将它们匹配到 AM 或 PM 时间将是一个自然的例子object AM {
  def unapply(t: LocalTime): Option[(Int, Int, Int)] =
  t match {
  case Time(h, m, s) if h < 12 => Some((h, m, s))
  case _ => None
  }
  }
  object PM {
  def unapply(t: LocalTime): Option[(Int, Int, Int)] =
  t match {
  case Time(12, m, s) => Some(12, m, s)
  case Time(h, m, s) if h > 12 => Some(h - 12, m, s)
  case _ => None
  }
  }
  其中 case _ =>是默认情况,如果没有其他匹配项,则会使用此进行匹配,此外我们刚刚介绍了另外两个用于部分匹配的功能
  •守卫(guards),例如case Time(h, m, s) if h < 12•常量匹配,例如case Time(12, m, s)
  现在已经看到 Scala 模式匹配的强大功能!
  我们自己实现一个可以很好地格式化当前时间的时钟,通过使用模式匹配和 AM / PM 提取器(加上一些看起来像表情符号流的老派 Java 字符串格式)LocalTime.now match {
  case t @ AM(h, m, _) =>
  f"$h%2d:$m%02d AM ($t precisely)"
  case t @ PM(h, m, _) =>
  f"$h%2d:$m%02d PM ($t precisely)"
  }
  我们已经探索了 Scala 模式匹配的大部分特性。可以在这里[1]找到这篇博文的所有源代码,为了更好地理解可以在 IntelliJ IDEA中运行这些代码,最后如果 Scala 代码中有一些复杂的、嵌套的 ifs 和 elses,请尝试使用模式匹配来更好地重构它。
  引用链接
  [1]这里:https://gist.github.com/linasm/003eec9eacc641167227193f5879bbd9

淡马锡增持Robinhood沽清Uber腾讯音乐新加坡国营投资机构淡马锡(Temasek)向美国SEC提交的文件披露,淡马锡上季增持多只在美国上市的消费相关股份,包括东南亚网约车平台Grab美国网上证券商Robinhood零售商汉字转拼音ChinesetoPinyin从网上找的资料,记得以前在C中曾经用过这类资料,保存下来以后再进一步测试和应用。一引入maven依赖dependencygroupIdcom。belerwebgroupIdpiny如果被困电梯怎么办?开门见山地说吧,如果被困电梯,我们应该采取如下措施首先请保持镇定。电梯槽都有防坠安全装置,会牢牢夹住电梯两旁的钢轨。只要电梯没有解体,那么这个狭小的空间将会成为暂时的庇护所。然后立怎样下载头条中的视频音乐?需要注意哪些问题?首先感谢邀请!关于如何下载头条中的视频音乐,我曾经回答过类似的提问,今天再次作答,并加以完善和补充方法一通过今日头条APP下载1在播放音乐视频的页面中,点击右下角的分享按钮,朝右滑大家都去哪个交友网站?我之前用的IUDating和我老婆认识的,上面都是些真是的单身人士可以在线翻译180余个国家语言。满意我的回答吗?如果满意请采纳下交友软件的话,放在以前,最火的社交平台估计是百合网年薪4亿的中国最贵科技CEO是谁?我们对高管薪资做了个排行科股头条虎年开年,有关财富和自由的话题热度不减。市值均值超过百亿的科技巨头们,如何给高管发年薪?中国科技公司的高管薪资水平,对于大多数投资人而言也是谜一般的存在。去年,联想CEO杨元庆1。网易QQ之外,听音乐的第三个选择最近换了手机需要重新下载个音乐软件用来听歌,但在下载的时候出现了犹豫。以前基本都是用网易云音乐,但网易在最近一年的更新后感觉越来越不靠谱了。增加了大量用不到的功能,导致软件初始大小利用变更数据采集(CDC)同步数据库(2)这是关于变更数据采集(CDC)系列的第二部分。在这篇文章中,让我们讨论CDC的使用案例,并看看有哪些工具可以帮助你把CDC添加到你的架构中。变更数据采集有助于实现事件驱动的应用架构免费通用数据库工具DBeaver,替代收费的Navicat官网介绍通用数据库工具免费的多平台数据库工具,适用于开发人员数据库管理员分析师和所有需要使用数据库的人。支持所有流行的数据库MySQLPostgreSQLSQLiteOracleD华为很给力,鸿蒙Os35000mAh,16512G大存储自从美国修改规则后,大家会看到华为手机业务的更新速度十分缓慢,而且据相关数据还显示,华为手机的整体销量还出现了严重下滑状态,虽然目前还能取得国内销量第四名的好成绩,但华为海思麒麟手错过AMD前女友,英特尔宣布54亿美元收购Tower半导体IT之家2月15日消息,去年7月,华尔街日报称知情人士表示,半导体巨头英特尔正在考虑以300亿美元(约2000亿人民币)的价格收购美国晶圆代工厂商格芯(GlobalFoundrie
iPhone14相关信息曝光标准版用A15芯片,Pro版用A16最新的爆料显示,苹果将为新iPhone14迭代带来不同的芯片搭载。只有iPhone14Pro系列的机型能够配备新一代A16芯片,而定位稍低的iPhone14系列将保留iPhone1孟晚舟回国后首次公开亮相华为于28日下午在深圳总部举行2021年经营财报发布会,华为首席财务官孟晚舟回国后首次公开亮相。她在发布会上透露,2021年,华为收入为6368亿元人民币,同比下降28。6净利润为闪电深1度为实现这个重点突破,山东八个部门联合推进聚力成势齐鲁网闪电新闻3月29日讯山东又一重磅行动方案出炉。近日,山东省工业和信息化厅省委网信办省发展改革委省科技厅省农业农村厅省商务厅省大数据局省通信管理局等八部门联合印发山东省2022有什么好的手机移动办公软件可以推荐?哈哈,其实我知道的也不多。这是我整合的几个好用的办公软件,可以参考一下!大家也可以一起分享嘛!1番茄Todoapp番茄Todoios版是一款简约漂亮高效的番茄钟,页面风格简单清爽,2022年拍照手机推荐这几款,不输专业小单反,拍照爱好者必备到如今,手机已经不是简单的通讯工具了,我们的工作生活学习社交很多方面都已经离不开手机了。伴随着手机功能越来越多,以前很多东西都渐渐淡出了视野,像收音机随身听游戏机等等,而如今手机拍年营收6388亿元,利润1137亿,研发投入超1427亿,这就是华为今天是华为公布2021年经营业绩的日子,也是孟晚舟去年9月回国后,半年来第一次公开亮相。孟晚舟不仅仅是华为创始人任正非的女儿,她还是华为的副董事长,首席CFO(首席财务官)。因此,刘强东继续隐身前段时间,网上流出一组照片,刘强东带着妻子章泽天和女儿在三亚度假,看起来心情很好。随即网友热议开来,许久不见的刘强东似乎没有多大变化。自从2018年以来,刘强东基本上处于隐身状态,RedmiK50使用几天,给我的一些感受刚才去看了红米k50这款手机的定金预售量已经超过了15万台,是什么原因导致这款手机能够受到市场的追捧,到底他值不值得去买?我希望能够给大家一些建议,下面跟大家聊一聊使用了几天的红米小米杂货铺又上新品,1199元的多看电纸书ProII值不值得入手?提到了小米公司,相信在座的各位一定都不会陌生。正是因为小米的出现,让更多人的年轻人体会到了科技的乐趣也正是因为小米的出现,才让大家知晓,其实高品质和低价格是可以兼得的。丰富的生态链蔚小理财报连发,小鹏卖车最多赚钱最少撰文韩玲编辑冒诗阳卖最多的车,赚最少的钱3月28日晚,小鹏汽车发布了2021第四季度及2021财年未经审计的财报。至此,蔚小理三家头部新造车企业2021年的财报均已公布。在财报发布高通终于停止摆烂出新芯,这一波感谢天玑9000和8100的不俗表现近日据外媒爆料称高通将在5月上旬发布全新的骁龙8Gen1处理器。看到这条消息的科技发烧友纷纷发出感慨高通骁龙终于停止摆烂了?终于意识到的骁龙888和8Gen1芯片是电子垃圾了?骁龙