scala

和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。

Scala语言是完全面向对象的语言,所以并没有静态的操作。但是为了能够和Java语言交互,就产生了一种特殊的对象来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有"静态"内容都可以放置在它的伴生对象中声明

单例对象采用object 关键字声明

单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。

单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。

如果想让主构造器变成私有的,可以在()之前加上 private。

apply 方法可以重载。

Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。

用以统一面向对象编程和函数式编程的风格。

当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的

Scala 语言中,采用特质 trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字 trait 声明。

Scala 中的 trait 中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质。这种感觉类似于 Java 中的抽象类

语法:

trait 特质名 {

trait 主体

}

一个类具有某种特质,就意味着这个类满足了这个特质的所有要素, 所以在使用时,也采用了extends 关键字,如果有多个特质或存在父类,那么需要采用with 关键字连接。

基本语法: 没有父类:class 类名 extends 特质 1 with 特质 2 with 特质 3 ...

有父类:class 类名 extends 父类 with 特质 1 with 特质 2 with 特质 3... 2)

类和特质的关系:使用继承的关系。

当一个类去继承特质时,第一个连接词是 extends,后面是with。

如果一个类在同时继承特质和父类时,应当把父类写在 extends 后。

特质可以同时拥有抽象方法和具体方法

一个类可以混入多个特质

所有的 Java 接口都可以当做Scala 特质使用

动态混入:可灵活的扩展类的功能

动态混入:创建对象时混入 trait,而无需使类混入该 trait

如果混入的 trait 中有未实现的方法,则需要实现

由于一个类可以混入(mixin)多个 trait,且 trait 中可以有具体的属性和方法,若混入的特质中具有相同的方法(方法名,参数列表,返回值均相同),必然会出现继承冲突问题。

第一种,一个类(Sub)混入的两个 trait(TraitA,TraitB)中具有相同的具体方法,且两个 trait 之间没有任何关系,解决这类冲突问题,直接在类(Sub)中重写冲突方法。

第二种,一个类(Sub)混入的两个 trait(TraitA,TraitB)中具有相同的具体方法,且两个 trait 继承自相同的 trait(TraitC),及所谓的"钻石问题",解决这类冲突问题,Scala 采用了特质叠

优先使用特质。一个类多个特质是很方便的,但却只能扩展一个抽象类。

如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数, 而特质不行(有无参构造)。

枚举类:需要继承 Enumeration

应用类:需要继承App

使用 type 关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名

Scala 的集合有三大类:序列 Seq、集Set、映射 Map,所有的集合都扩展自 Iterable 特质。

对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包 不可变集合:scala.collection.immutable 可变集合: scala.collection.mutable

Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象, 而不会对原对象进行修改。

类似于 java 中的 String 对象 可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似于 java 中 StringBuilder 对象

建议:在操作集合的时候,不可变用符号,可变用方法

Set、Map 是 Java 中也有的集合

Seq 是 Java 没有的,我们发现 List 归属到Seq 了,因此这里的 List 就和 Java 不是同一个概念了

我们前面的for 循环有一个 1 to 3,就是 IndexedSeq 下的 Range

String 也是属于 IndexedSeq

我们发现经典的数据结构比如 Queue 和 Stack 被归属到 LinearSeq(线性序列)

大家注意Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序

IndexedSeq 是通过索引来查找和定位,因此速度快,比如String 就是一个索引集合,通过索引即可定位

LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找

不可变数组

定义:val arr1 = new Array[Int](10)

new 是关键字

Int\]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定Any (10),表示数组的大小,确定后就不可以变化 第二种方式定义数组 val arr1 = Array(1, 2) 在定义数组时,直接赋初始值 使用apply 方法创建数组对象 定义变长数组 val arr01 = ArrayBuffer\[Any\](3, 2, 5) \[Any\]存放任意数据类型 (3, 2, 5)初始化好的三个元素 ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer arr1.toBuffer //不可变数组转可变数组 arr2.toArray //可变数组转不可变数组 arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化 arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变 人工智能scala 发布于2025-04-03 著作权归作者所有

相关推荐
搞程序的心海3 小时前
用Scala玩转Flink:从零构建实时处理系统
开发语言·flink·scala
等雨季4 小时前
scala编程语言
开发语言·scala
神奇的黄豆7 小时前
Scala 面向对象编程总结
数据结构·scala
煤烦恼9 小时前
scala类与集合
java·大数据·开发语言·人工智能·scala
啊喜拔牙3 天前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
企鹅不耐热.3 天前
Scala基础知识6
开发语言·后端·scala
一元钱面包3 天前
scala课后总结(6)
scala
凉白开3385 天前
Scala基础知识
开发语言·后端·scala
不要不开心了5 天前
Scala内容
开发语言·pytorch·flask·scala·dash