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://xiahunao.cn/news/2978607.html

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

相关文章

L3-1 夺宝大赛-2024天梯赛(内存超限解决方法)

题目 夺宝大赛的地图是一个由 nm 个方格子组成的长方形&#xff0c;主办方在地图上标明了所有障碍、以及大本营宝藏的位置。参赛的队伍一开始被随机投放在地图的各个方格里&#xff0c;同时开始向大本营进发。所有参赛队从一个方格移动到另一个无障碍的相邻方格&#xff08;“…

聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用

前言 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…

Redis入门到通关之Redis实现Session共享

文章目录 ☃️前期概要☃️基于Session实现登录方案☃️现有方案存在的问题☃️Redis代替Session的业务流程❄️❄️设计key的结构❄️❄️设计key的具体细节❄️❄️整体访问流程 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博…

redis原理篇(黑马程序员虎哥 )回忆笔记

原理&#xff0c;老师讲的真好。相见恨晚。 以下内容是按视频课程的章节安排&#xff0c;在我自己听完课之后&#xff0c;凭借记忆总结的。&#xff08;可能存在疏漏不足&#xff0c;后期补全和修正&#xff0c;同时也在这个过程巩固我自己的对于这个组件相关原理的学习&#x…

中国DIVI版,wordpress DIVI网站主题在国内的替代方案。

最受欢迎的WordPress主题之一是Divi。我们创建了这个全面的Divi主题评论&#xff0c;以帮助您更好地了解其优点和潜在缺点。 Divi主题是什么&#xff1f; Divi是一个流行的WordPress主题&#xff0c;提供了一个网站建设平台。它有一个可视化编辑器选项&#xff0c;为新手和专业…

手撕红黑树(map和set底层结构)(2)

[TOC]红黑树 一 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&…

选择ERP系统需要考虑哪些因素 企业ERP系统选型指南

ERP系统是一个复杂的软件系统&#xff0c;中小企业要建成ERP系统首先是要选择一个适合自己的ERP软件。目前市场上的ERP软件品种繁多&#xff0c;功能各异&#xff0c;那么中小企业应如何结合自己的实际情况“量体裁衣”找到最适合自己的ERP软件呢?这是目前中小企业进行ERP选型…

介绍-响应式编程-001

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 开篇&am…

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

系列文章目录 前言 本综合指南提供了在英伟达 Jetson设备上部署Ultralytics YOLOv8 的详细攻略。此外&#xff0c;它还展示了性能基准&#xff0c;以证明YOLOv8 在这些小巧而功能强大的设备上的性能。 备注 本指南使用Seeed Studio reComputer J4012进行测试&#xff0c;它基于…

2024年三支一扶报名照上传要求很严格

2024年三支一扶报名照上传要求很严格

Unity 使用GPU计算物体距离

在游戏开发中&#xff0c;计算物体之间的距离是一个常见的需求&#xff0c;例如用于碰撞检测、视觉效果等。传统的计算方法可能会在大量物体时带来性能问题&#xff0c;而在 Unity 中&#xff0c;借助 GPU 进行计算可以有效提高性能。本文将介绍一种使用 Compute Shader 在 Uni…

windows安装nc命令的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

找回删除的视频,3个神奇小妙招!

“作为一名业余摄影师&#xff0c;我保存了很多重要的视频文件在电脑上&#xff0c;但刚刚电脑突然没电关机&#xff0c;开机后我发现很多视频莫名消失了。有什么方法可以找回这些丢失的视频吗&#xff1f;” 在数字化时代&#xff0c;视频文件往往承载着我们生活中的重要回忆。…

Windows 安全中心:页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问,并且你尝试访问的项目不可用。有关详细信息,请与 IT 支持人员联系。

问题 1&#xff1a;Windows 安全中心提示&#xff1a;【页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问&#xff0c;并且你尝试访问的项目不可用。有关详细信息&#xff0c;请与 IT 支持人员联系。】 修复 Microsoft.SecHealthUI 方法 1&#xff1a;命令自动重装安…

【C语言】数据的存储_数据类型:浮点型存储

常见的浮点数&#xff1a; 3.1415926 1E10 浮点型包括&#xff1a;float、double、long double类型 浮点数表示的范围&#xff1a;float.h中定义 浮点数存储规则&#xff1a; 第二个n和*pFloat在内存中明明是同一个数&#xff0c;但浮点数和整数解读结果差别很大。 要理解这…

Web入门-Tomcat

黑马程序员JavaWeb开发教程 文章目录 一、简介1、Web服务器2、Tomcat 二、基本使用三、入门程序解析 一、简介 1、Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发部署Web项目&#xff0c;对外提供网上信息浏览服务 2、Tomcat 概念&#xff1a;Tomcat是Apach…

Gitea 简单介绍、用法以及使用注意事项!

Gitea 是一个轻量级的代码托管解决方案&#xff0c;它提供了一个简单而强大的平台&#xff0c;用于托管和协作开发项目。基于 Go 语言编写&#xff0c;与 GitLab 和 GitHub Enterprise 类似&#xff0c;但专为自托管而设计。以下是对 Gitea 的详细介绍&#xff0c;包括常用命令…

TI API ,详情见ti.com

TI API &#xff0c;详情见ti.com TI API 接口开发&#xff0c;实现货品查询、查询订单、自动下单、抢购等功能。

掌握C++17的“武器“:Boost库带来的新特性

C 17如何受益于Boost库 一、简介二、搜索算法三、文件系统库&#xff1a;filesystem四、特殊数学函数&#xff1a;clamp、gcd等五、模板增强&#xff1a;and、or、not六、C 20概览七、总结 一、简介 在上一篇文章中关于介绍了几个特性&#xff1a;std::optional、std::variant…