安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

详解Scala模式匹配

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

法本信息与京东科技签订合作框架协议法本信息4月25日晚间公告,与京东科技签订合作框架协议,双方拟在全国区域展开合作,在企业数字化平台研发、实施及市场推广等领域开拓市场份额,互为优先合作商。同日发布一季报和202……检察院出手!腾讯被起诉!微信回应来了北京市海淀区厂洼西路8号海淀区人民检察院公告称,该院在履行职责中发现,深圳市腾讯计算机系统有限公司的微信产品青少年模式不符合《中华人民共和国未成年人保护法》相关规定,侵犯未成年……七夕节蓝牙耳机怎么选?六年测评师分析五款口碑最好的蓝牙耳机大家好,我是齐岚,一个有着六年经验的数码产品测评师。一年一度的七夕情人节马上就要来临了,选择送什么礼物一直以来都是世纪大难题。齐岚今天要为大家的正是时下最好的真无线蓝牙耳机。不……有了智能手机后,时间过得越来越快,你的感觉是这样吗?说的真对,自买了智能手机后,由于节目广泛,乐趣横生,尤其参于头条后,对联、诗词、书法、戏曲等,还有悟空问答。因内容广阔,读写並进,在晚上不知不觉就零点了。虽然精神疲惫,但心态很……长盈精密被宁德时代授予供应商质量优秀奖依据长盈精密官方公众号消息,在宁德时代2021年12月2日举行的第三季度供应商质量评选中,公司获得宁德时代各部门联合评选的红榜表扬,被授予2021年第三季度供应商质量优秀奖,并……5G产业潮头破浪智能汇集引领未来国际在线报道(记者沈湜胡君颜):5月20日,第五届世界智能大会在天津开幕。大会期间,中国移动5G在智能制造、智慧城市、智慧能源、智慧交通、智慧医疗、智慧家居等14个重点行业的创……电池续航测试排名6款手机对比,iPhone13ProMax排如今的智能手机似乎到了瓶颈期,创新越来越少,比如当前热卖的iPhone13系列旗舰手机,虽然没有什么创新,但丝毫不影响消费者对它的热爱,从各大平台来看,目前iPhone13系列……详解Scala模式匹配本篇博客中我们将采用类似的方法,并熟悉Scala编程语言的另一个重要特性模式匹配。同样我们将通过编写一些简短的代码片段,一系列小步骤来逐步深入。我们首先声明一个非常简单的……盛虹集团新能源新材料战略深入推进变碳为宝加快绿色转型中证网讯(王珞)双碳目标提出后,推动绿色发展、加快绿色转型,成为十四五产业高质量发展的战略要求,企业的发展方式也面临全新的机遇和挑战。在新时代新发展理念引领下,东方盛虹(000……跨境电商亚马逊如何节约成本多赚钱,以下几点,一个不能少跨境电商亚马逊如何节约成本多赚钱从?2022年1月18日开始,亚马逊上调了FBA相关的费用,卖家的成本又增加了不少。虽然亚马逊提高的这部分费用最终会被卖家转嫁到消费者身上……犹豫中我还是没选中满意的电纸书产品我算是个重度阅读爱好者,特别是晚上睡觉一定要看会书,才能睡着。从最早的Kindle,到早期的ireader,后面用过博阅,2020年5月买了文石的nova2,一直用到现在,积累……教AI认手语的年轻人借助科技让更多聋人被听见教AI认手语的年轻人他们借助科技力量,试图让更多聋人被听见听懂记者雷琨、李亭、梁姊今年5月,世界智能大会现场,一个手语角吸引了不少人驻足。只要在摄像头前打出手……
搭1。5T动力,匹配世界十佳变速箱,带你看全新AX7马赫版小米12不香了,小米机皇提前退场,从4499已降至3199我的快递到底是谁在做主?你是如何看待快递不送货上门的?右耳听力正常,但左耳听力是重度听力损失的情况下不配助听器可以今年最受期待新机?华为Mate50系列曝光,或将带来5G版本国产手机黔驴技穷,性价比已经输给苹果,是否已遭到消费者抛弃?索尼65x90j和65x91j有什么区别?哪一款性价比高?来WhatsApp停用,复活的最快方法,你必须懂十大蓝牙耳机排名,2021性价比蓝牙耳机手机丢了不要怕,教你精准定位找回爱机荣耀X30Max超大屏幕,搭载天玑900处理器游戏追剧皆可威马汽车D2轮斩获1。52亿美元融资

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利