Scala 04 —— Scala Puzzle 拓展

在这里插入图片描述
在这里插入图片描述

Scala 04 —— Scala Puzzle 拓展

文章目录

  • Scala 04 —— Scala Puzzle 拓展
      • 一、占位符
      • 二、模式匹配的变量和常量模式
      • 三、继承 成员声明的位置
          • 结果
          • 初始化顺序分析
            • `BMember` 类
            • `BConstructor` 类
      • 四、缺省初始值与重载
      • 五、Scala的集合操作和集合类型保持一致性
          • 第一部分代码解释
          • 第二部分代码解释
      • 六、for和map的区别

一、占位符

val list1:List[Int] = List(1,2,3).map(_ + 1)
val list2:List[Int] = List(1,2,3).map(r => r + 1)

在上面的例子中,两代码的返回结果其实是一样的,都是 List(2,3,4),而在第一行中的 _叫做占位符,可以让我们的代码更加简洁 但是这并不意味着使用 _ 和箭头函数是同样的结果

val list1:List[Int] = List(1,2,3).map{println("ss");_ + 1}
val list2:List[Int] = List(1,2,3).map{r => println("ss");r + 1}

在上面的代码中,看起来运行的结果还是一样的,但是事实却不是这样的,当然 list1list2的返回值是一样的,但是执行的过程中打印的结果却是不一样的, 第一行代码打印了一行 ss,第二行代码打印了三行 ss

为什么会有这样的不同?

Map函数的本质是对每个集合中的元素应用一个函数,第一个语句中函数的执行体只是_+1,第二个语句中函数的执行体是println("ss");r + 1

二、模式匹配的变量和常量模式

  • 变量模式:模式匹配的标识符是小写字母,作用是赋值

    val (x,y) = (1,2)
    
  • 常量模式:模式匹配的标识符是大写字母,该常量必须是已赋值的,否则会报错,作用是判断

    val (X,Y) = (1,2)// 报错
    x match {case PI => "圆周率"
    }
    

三、继承 成员声明的位置

trait A{val audience:Stringprintln("Hello " + audience)
}
class BMember (a:String = "World") extends A{override val audience: String = aprintln("I repeat:Hello " + audience)
}class BConstructor(val audience:String = "World") extends A{//该种方法声明的变量不会存在null的情况println("I repeat:Hello " + audience)
}
new BMember("reader")
new BConstructor("reader")
结果
Hello null
I repeat:Hello reader
Hello reader
I repeat:Hello reader
初始化顺序分析
BMember
  1. 调用构造器:当创建 BMember 的实例时,首先初始化父类 A
  2. 父类 A 的初始化:在 Scala 中,父类的构造代码块(包括字段的初始化和任何其他语句)首先被执行。在 A 中,audience 还未被 BMember 初始化,因此其值为 nullString 类型的默认值)。
  3. 打印语句执行:打印 "Hello " + audience,由于 audience 还是 null,输出 Hello null
  4. 子类 BMember 的字段初始化:初始化 audience 为传入的参数 "reader"
  5. 子类中的打印语句:接着执行 BMember 中的打印语句,输出 "I repeat: Hello reader"
BConstructor
  1. 构造器参数:在 BConstructor 类中,audience 是通过构造器参数直接定义的。这意味着在调用父类 A 的构造器之前,audience 已经被初始化。
  2. 父类 A 的初始化:由于 audience 已经初始化为 "reader",当父类 A 中的打印语句执行时,输出 "Hello reader"
  3. 子类中的打印语句:紧接着在 BConstructor 中,再次打印 "I repeat: Hello reader"

总结:

一般来说,子类在初始化时会先初始化父类构造器构造出父类对象,因为子类可能有依赖于父类对象的属性或方法。

作为类字段被赋值,在父类构造器执行后才初始化;作为构造参数被赋值,在父类构造器执行前初始化。

四、缺省初始值与重载

trait A {val foo: Int //缺省初始值,Boolean缺省初始值是false,Unit缺省初始值是()def bar: Int = 10 //附初值的变量后面只能用overrideprintln(s"In A:foo=$foo,bar=$bar") //0,0,0
}class B extends A {val foo: Int = 25println(s"In B:foo=$foo,bar=$bar") //25,36,0}
class C extends B {override val foo: Int = 46 //当一个val被重载的时候,只能初始化一次override def bar: Int = 100println(s"In C:foo=$foo,bar=$bar") //25,36,99}new C()/*
In A:foo=0,bar=100
In B:foo=0,bar=100
In C:foo=46,bar=100
*/
  • 字段初始化顺序:像val foo:Int,字段初始化发生在构造器体执行之前,但超类的构造器(包括 println 语句)会在任何子类字段初始化之前执行。

  • 方法动态绑定:像def bar:Int=5,Scala 会使用动态绑定来决定应该调用哪个版本的方法。即使在超类的构造器中,也会调用最终重写的方法版本(在 C 中为 100)。

  • 字段重写foo 在子类中被重写,但在超类和任何父类的构造器中引用这个字段时,它们看到的是其默认值(在赋值之前),直到子类自己的构造器赋予它新值。

  • 当一个 val被重载,只能初始化一次

五、Scala的集合操作和集合类型保持一致性

def sumSizes(collections:Iterable[Iterable[_]]):Int = {//      println(s"collections:$collections")//      println(collections.map(_.size))collections.map(_.size).sum
}
第一部分代码解释
println(sumSizes(List(Set(1,2),List(3,4))))

在这里,输入是List类型的,包含两个集合:一个Set和一个ListList映射(map)操作会返回一个新的List,其中包含每个子集合的大小:

  • Set(1, 2)的大小为2(因为集合中不允许重复值)
  • List(3, 4)的大小为2

因此,map(_.size)返回List(2, 2),其和为4。

第二部分代码解释
println(sumSizes(Set(List(1,2),Set(3,4))))

这里输入是Set类型的。由于Setmap操作后仍保持Set类型,而且不允许重复值,它会影响结果:

  • List(1, 2)的大小为2
  • Set(3, 4)的大小也是2

由于结果Set不能有重复值,map(_.size)产生的结果是Set(2),其和为2,因为只有一个元素。

def sumSizes1(collections:Iterable[Iterable[_]]):Int = {collections.toSeq.map(_.size).sum
}

不管是什么集合类型,都将其转换成Seq

六、for和map的区别

val ys = for(Seq(x,y,z) <- xs) yield x+y+z

这里的for表达式等价于先进行withFilter过滤掉不符合模式Seq(x, y, z)的元素,然后对过滤后的元素应用map。因此,Seq("g","h")因为只有两个元素而被忽略,不参与后续的map操作。

val zs1 = xs map {case Seq(x,y,z) =>x+y+z}

当遇到Seq("g", "h")时,模式Seq(x, y, z)无法匹配只有两个元素的序列,因此Scala抛出了MatchError

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/641935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】认识测试|测试岗位|软件测试和开发的区别|优秀的测试人员需要具备的素质

推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 一、什么是测试 测试在⽣活中处处可⻅ 1.生活中的测试场景 案例⼀&#xff1a;对某款购物软件进⾏测试 *启动测试&#xff1a;…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…

[2024更新]如何从Android恢复已删除的相机照片?

相信大家都经历过Android手机误删相机图片的经历。您是否正在寻找一种可行的方法来挽救这些丢失的照片&#xff1f;如果这是你迫切想解决的问题&#xff0c;那么这篇文章绝对可以帮助你。然而&#xff0c;与其考虑如何从Android恢复已删除的相机照片&#xff0c;我们更愿意建议…

【Qt】:界面优化(一:基本语法)

界面优化 一.基本语法1.设置指定控件样式2.设置全局控件样式3.从文件加载样式表4.使⽤Qt Designer编辑样式&#xff08;最常用&#xff09; 二.选择器1.概述2.子控件选择器3.伪类型选择器 三.盒模型 在网页前端开发领域中,CSS是一个至关重要的部分.描述了一个网页的"样式&…

C++之类和对象--赋值运算符重载和const成员函数

目录 1.赋值运算符重载 1.1运算符重载 1.2赋值运算符重载 1.3其它特性 2.const成员函数 3.取地址及const取地址操作符重载 hello&#xff0c;欢迎大家来到小恶魔频道&#xff0c;今天讲解的是C里面的赋值运算符重载以及const成员函数 1.赋值运算符重载 1.1运算符重载 运…

基于Springboot的新生宿舍管理系统

基于SpringbootVue的新生宿舍管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告信息管理 院系管理 班级管理 学生管理 宿舍信息管理 宿舍安排管理…

Unity系统学习笔记

文章目录 1.基础组件的认识1.0.组件继承关系图1.1.项目工程文件结构&#xff0c;各个文件夹都是做什么的&#xff1f;1.2.物体变化组件1.2.3.三维向量表示方向1.2.4.移动物体位置附录&#xff1a;使用变换组件实现物体WASD移动 1.3.游戏物体和组件的显示和禁用1.3.1.界面上的操…

python 对图片进行操作

Pillow是一个强大的图像处理库&#xff0c;它提供了许多用于打开、操作和保存图像的功能。 Image模块&#xff1a; Image模块提供了用于打开、创建、编辑和保存图像的基本功能。可以使用Image.open()函数来打开图像文件&#xff0c;或者使用Image.new()函数来创建新的图像,还可…

DSP系统的设计过程与选型

DSP的设计步骤分几个阶段&#xff0c;应用系统的设计过程如图所示。 技术指标的确定 器件的选型原则 其他因素的考虑

css再学习

id选择器的id仅能使用一次&#xff1b; 可去除也可添加加粗效果&#xff1b; font 行高为数字n时&#xff08;不添加单位&#xff09;是浏览器默认font-size的n倍&#xff1b; 行高实现文字垂直居中&#xff08;仅适应于单行文字&#xff09;&#xff1a;将line-height设置…

思科警告:全球出现大规模针对 VPN 服务的暴力破解攻击事件

近日&#xff0c;全球范围内出现了大量针对思科、CheckPoint、Fortinet、SonicWall 和 Ubiquiti 设备的 VPN 和 SSH 服务的大规模凭据暴力破解活动。 原文地址&#xff1a;https://mp.weixin.qq.com/s/UoMgC8Bp6OMJiXgeU3XbyA 暴力攻击是指使用许多用户名和密码尝试登录帐户或…

科研基础与工具(论文写作)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候&#xff0c;不不知道怎么…