Scala 03 —— Scala Puzzle 拓展

news2025/1/18 11:45:02

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

Scala 03 —— Scala Puzzle 拓展

文章目录

  • Scala 03 —— 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:String
  println("Hello " + audience)
}
class BMember (a:String = "World") extends A{
  override val audience: String = a
  println("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 //附初值的变量后面只能用override
  println(s"In A:foo=$foo,bar=$bar") //0,0,0
}

class B extends A {
  val foo: Int = 25
  println(s"In B:foo=$foo,bar=$bar") //25,36,0

}
class C extends B {
  override val foo: Int = 46 //当一个val被重载的时候,只能初始化一次

  override def bar: Int = 100

  println(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.coloradmin.cn/o/1608380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …

synchronized锁升级原理

锁升级过程 jdk1.6之后的优化 synchronized锁有四种状态&#xff0c;无锁&#xff0c;偏向锁&#xff0c;轻量级锁&#xff0c;重量级锁&#xff0c;这几个状态会随着竞争状态逐渐升级&#xff0c;锁可以升级但不能降级&#xff0c;但是偏向锁状态可以被重置为无锁状态。 1、偏…

severstal谢韦尔金属数据集CSV格式转YOLO格式

谢韦尔数据集 在kaggle上即可找到&#xff0c;在csdn、百度、知乎上搜索都能搜到&#xff0c;这里不附下载链接了 谢韦尔数据集的标注为CSV文件&#xff0c;格式如下&#xff1a; 谢韦尔数据集为分割数据集&#xff0c;像素编码格式 格式 谢韦尔数据集为像素编码格式&#…

机器学习:考试复习提纲

该页仅为复习资料&#xff0c;内含博客链接均通过搜索得到。 当然直接访问我的GitHub博客会更方便。 1. 线性回归 Linear Regression https://www.cnblogs.com/geo-will/p/10468253.html 要求1&#xff1a;可以按照自己的理解简述线性回归问题。 回归分析是一种预测性的建模…

【FreeRTOS】RTOS任务的同步与互斥:(二)信号量

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;二&#xff09;信号量 信号量概念二值信号量二值信号量概念二值信号量相关API函数二值信号量的案例设计cubeMX配置软件程序设计 计数型信号量计数型信号量概念计数型信号量相关API函数二值信号量的案例设计cubeMX配置…

线程池 ThreadPoolExecutor 配置参数详解

《开发语言-Java》 线程池 ThreadPoolExecutor 参数详解 一、引言二、主要内容2.1 核心构造函数2.2 核心线程数2.3 最大线程数2.4 空闲线程存活时间2.5 keepAliveTime 的时间单位2.6 核心线程在空闲时的回收策略2.7 工作队列2.8 线程工厂2.9 拒绝策略 三、总结 一、引言 提到 …

VOJ 网页跳转 题解 STL栈

网页跳转 用例输入 10 VISIT https://www.jisuanke.com/course/476 VISIT https://www.taobao.com/ BACK BACK FORWARD FORWARD BACK VISIT https://www.jisuanke.com/course/429 FORWARD BACK用例输出 https://www.jisuanke.com/course/476 https://www.taobao.com/ https…

JavaEE进阶:基础知识

JavaEE&#xff1a;Java企业开发 Web网站的工作流程 ⽬前用户对PC端应⽤的开发结构模式主要分为C/S和B/S结构. CS即Client/Server&#xff08;客户机/服务器&#xff09;结构. 常⻅的C/S架构的应⽤⽐如QQ&#xff0c;CCTALK&#xff0c;各种⽹络游戏 等等&#xff0c;⼀般需…

吴恩达机器学习理论基础—逻辑回归模型

吴恩达机器学习理论基础—逻辑回归模型 说明&#xff1a;逻辑回归解决的是分类问题&#xff1a;例如常见的二分类问题。即得到的输出结果只有两个值的信息。 逻辑回归概念基础 逻辑回归用来解决数据集为0和1的二分类的问题 使用逻辑回归模型来解决对应的问题则需要使用一个函…

在 Ubuntu 12.10 安装 wxPython

安装 wxPython 可以使用 pip 工具&#xff0c;但在 Ubuntu 12.10 上需要首先安装 wxPython 的依赖项。请注意&#xff0c;Ubuntu 12.10 已于2013年终止支持&#xff0c;建议升级到更高版本的 Ubuntu。以下是在 Ubuntu 12.10 上安装 wxPython 的一般步骤&#xff1a; 一、问题背…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

011、Python+fastapi,第一个后台管理项目走向第11步:建立python+fastapi项目,简单测试一下

一、说明 本文章就是记录自己的学习过程&#xff0c;如果有用您可以参考&#xff0c;没用你就略过&#xff0c;没有好与不好之分&#xff0c;今天主要是参考了gitee上的一些项目&#xff0c;一步一步的往后i建立 对于学习来说&#xff0c;如果您有java c等经验&#xff0c;py…

注意力机制基本思想(二)(自注意力机制)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实…

河北专升本(c语言各种编程题)

目录 第一类、递归调用 第二类、特殊数字 第三类、多维数组 第四类、字符处理 第五类、数学问题 第六类、排序算法 第七类、循环问题 第八类、进制转换 第九类、实际应用 第十类、图形输出 第一类、递归调用 1.汉诺塔&#xff1a;请输入盘子数&#xff0c;输出盘子移动…

JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)

常用命令&#xff1a;jps、jinfo、jstat、jstack、jmap jps jps查看java进程及相关信息 jps -l 输出jar包路径&#xff0c;类全名 jps -m 输出main参数 jps -v 输出JVM参数jps命令示例 显示本机的Java虚拟机进程&#xff1a; # jps 15729 jar 92153 Jps 90267 Jstat显示主类…

【QT进阶】Qt Web混合编程之html、 js的简单交互

往期回顾 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用&#xff08;图文并茂超详细介绍&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&…

Mamba论文笔记

Mamba论文 结合序列建模任务通俗地解释什么是状态空间模型&#xff1f;创新点和贡献 为什么Mamba模型擅长捕获long range dependencies&#xff1f; 结合序列建模任务通俗地解释什么是状态空间模型&#xff1f; 状态空间模型&#xff08;State Space Model, SSM&#xff09;是…

css设置文字撑满盒子

效果如上&#xff1a; <div style"width: 250px;background-color:red;text-align-last:justify;word-break: keep-all;">为中国崛起而读书</div>

Git常见命令行操作和IDEA图形化界面操作

设置Git用户名和标签 在安装完Git以后需要设置用户和签名&#xff0c;至于为什么要设置用户签名可以看一下这篇文章【学了就忘】Git基础 — 11.配置Git用户签名说明 - 简书 (jianshu.com) 基本语法&#xff1a; git config --global user.name 用户名 git config --global u…

漳州不饱和聚酯树脂首次出口非洲

我可以确认&#xff0c;2024年4月中旬左右&#xff0c;漳州新阳科技有限公司制造的不饱和聚酯树脂产品首次出口至非洲市场。这批树脂共计167.2吨&#xff0c;经过漳州市古雷海关的监管放行后&#xff0c;被运往非洲国家阿尔及利亚和莫桑比克。这一举动标志着漳州企业在拓展国际…