Scala 03 —— Scala Puzzle 拓展

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

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: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.mzph.cn/news/825901.shtml

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

相关文章

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字&#xff08;C98&#xff09; 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰&#xff08;name Ma…

Vue3从入门到实践:深度了解新组件

1.Teleport 概念&#xff1a;Teleport&#xff08;传送门&#xff09;是一个新的特性&#xff0c;用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置&#xff0c;而不受组件层次结构的限制。 下面举出例子解释&#xff1a; 1.新建App.vue文件作…

RACE IPEMD:构建安全基石的密码学原理与实践

title: RACE IPEMD&#xff1a;构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD哈希算法SHA-1SHA-2/3消息摘要数字签名安全分析 前言 在当今信息爆炸的时代&#xff0c;数据安全和隐私保护变得尤为重要。密码学作为信息安…

Rust 构建跨平台 GUI 的新选择

在现代软件开发过程中&#xff0c;用户界面&#xff08;GUI&#xff09;的设计与实现是不可或缺的一环。随着Rust编程语言的崛起&#xff0c;其安全性、性能和并发特性使其成为开发高质量GUI应用的理想选择。relm框架&#xff0c;作为Rust生态中的一员&#xff0c;提供了一种声…

k8s的资源对象Deployment该如何使用?

k8s的资源对象Deployment该如何使用&#xff1f; Kubernetes&#xff08;k8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化应用程序部署、扩展和管理。在k8s中&#xff0c;Deployment是管理Pod副本的一种方式&#xff0c;它确保了指定数量的Pod副本始终运行。本…

计算机视觉——基于OpenCV和Python进行模板匹配

模板匹配&#xff1f; 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛&#xff0c;包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接&#xff1a;1584. 连接所有点的最小费用 - 力扣&#xff08;LeetCode&#xff09; 主要思路&#xff1a;使用krusal算法&#xff0c;将边的权值进行排序&#xff08;从小到大排序&#xff09;&#xff0c;每次将权值最小且未加入到连通分量中…

Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码

一. 简介 前一篇文章编写了SPI设备驱动框架代码&#xff0c;文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;SPI设备驱动框架编写-CSDN博客 本文继续SPI驱动代码的编写。向SPI驱动框架中加入字符设备驱动框架代码。 二. 向SPI驱动框架中加入字符设备驱动框架代码…

Cesium中实现镜头光晕

镜头光晕 镜头光晕 (Lens Flares) 是模拟相机镜头内的折射光线的效果&#xff0c;主要作用就是让太阳光/其他光源更加真实&#xff0c;和为您的场景多增添一些气氛。 Cesium 中实现 其实 Cesium 里面也是有实现一个镜头光晕效果的&#xff0c;添加方式如下&#xff0c;只是效…

Python教学入门:数字类型与字符串

字符串元素组成的序列 字符串元素组成的序列指的是字符串中的每个字符按照一定的顺序排列形成的序列。在 Python 中&#xff0c;字符串是由字符组成的有序序列&#xff08;Sequence&#xff09;&#xff0c;每个字符在字符串中有其固定的位置&#xff08;索引&#xff09;&…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器&#xff0c;该方法的源码如下&#xff1a; /*** Set the {link LayoutManager} that this RecyclerV…

java网络编程 BufferedReader的readLine方法读不到数据且一直阻塞

最近在整理Java IO相关内容&#xff0c;会遇到一些以前没有注意的问题&#xff0c;特此记录&#xff0c;以供自查和交流。 需求&#xff1a; 基于Java的BIO API&#xff0c;实现简单的客户端和服务端通信模型&#xff0c;客户端使用BufferedReader的readLine方法读取System.i…

7、docker 集群

docker集群 1、docker file参数设置 2、docker composeCompose和Docker兼容性常用参数Docker-compose.yml配置文件Docker-compose命令大全compose常用调试命令compose文件格式示例应用python flask-rediscpu和gpu配置 附件参考&#xff1a; 1、docker file 参考&#xff1a;ht…

ASPICE 追溯性实践分享

01前言 接着之前的分享&#xff0c;遗留的追溯性ASPICE 认证实践及个人理解分享-CSDN博客文章浏览阅读961次&#xff0c;点赞22次&#xff0c;收藏17次。ASPICE是Automotive 和SPICE的组合&#xff0c;全英文为&#xff08;Automotive Software ProcessImprovement and Determ…

树的遍历算法题总结(第二十六天)

144. 二叉树的前序遍历 题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 答案 class Solution {List<Integer> res new ArrayList(); public List<Integer> preorderTraversal(TreeNode root) {deal(root);return res;}void deal(TreeN…

C++修炼之路之继承<二>

目录 一&#xff1a;子类的六大默认成员函数 二&#xff1a;继承与友元 三&#xff1a;继承与静态成员 四&#xff1a;复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承&#xff1b;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

华为OD-C卷-内存冷热标记[100分]C++-100%

题目描述 现代计算机系统中通常存在多级的存储设备,针对海量 workload 的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,…

小程序 前端如何用wx.request获取 access_token接口调用凭据

在微信小程序中,获取access_token通常是通过wx.request方法来实现的。以下是一个简单的示例代码: 1.获取小程序的appID 与 secret(小程序密钥) 登录之后,请点击左侧的"开发管理"==>点击"开发设置" 就可以找到 2. 在javascript 中的代码: // 定…

【大模型完全入门手册】——大模型入门理论(基于Transformer的预训练语言模型)

博主作为一名大模型开发算法工程师,很希望能够将所学到的以及实践中感悟到的内容梳理成为书籍。作为先导,以专栏的形式先整理内容,后续进行不断更新完善。希望能够构建起从理论到实践的全流程体系。 助力更多的人了解大模型,接触大模型,一起感受AI的魅力! Transformer架构…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…