scala

news2025/8/12 12:38:57

Scala

概述

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。

  1. Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方 法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。)
  2. Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有 的Java类库,实现两种语言的无缝对接。
  3. Scala单作为一门语言来看,非常的简洁高效。

变量和数据结构

注释

Scala 注释使用和 Java 完全一样。

单行注释://

多行注释:/**/

文档注释:/*

​ *

​ */

变量和常量

常量:用val声明 val 常量名 [:常量类型]=初始值

变量:用var声明 var 变量名 [:变量类型]=初始值

注意:

  1. 能用常量的地方不用变量
  2. 声明变量时,类型可以省略,编译器自动推导,即类型推导
  3. 类型确定后,就不能修改,说明 Scala 是强数据类型语言。
  4. 变量声明时,必须要有初始值
  5. 在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变, val 修饰的变量不可改。
  6. var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值) 却是可以改变的。

数据类型

  1. Scala中一切数据都是对象,都是Any的子类。
  2. Scala中数据类型分为两大类:数值类型(AnyVal)、 引用类型(AnyRef),不管是值类型还是引用类型都是 对象。
  3. Scala数据类型仍然遵守,低精度的值类型向高精 度值类型,自动转换(隐式转换)
  4. Scala中的StringOps是对Java中的String增强
  5. Unit:对应Java中的void,用于方法返回值的位置,表 示方法没有返回值。Unit是 一个数据类型,只有一个对象 就是()。Void不是数据类型,只是一个关键字
  6. Null是一个类型,只 有一个对 象就 是null。它是 所有引用类型(AnyRef)的子类。
  7. Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使 用

在这里插入图片描述

整数类型

在这里插入图片描述

浮点类型

在这里插入图片描述

字符类型

字符类型可以表示单个字符,字符类型是 Char。

布尔类型

布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false。Boolean 类型占 1 个字节。

Unit 类型、Null 类型和 Nothing 类型

在这里插入图片描述

  1. Unit 类型用来标识过程,也就是没有明确返回值的函数。
  2. Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。Null 可以赋值给任 意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
  3. Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方 法不会正常返回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼 容。

类型转换

自动转换(隐士转换):精度小的自动向精度大的转换

强制类型转换:调用toXxx()方法

运算符

算术运算符

在这里插入图片描述

对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整 数部分而舍弃小数部分。

对一个数取模 a%b,和 Java 的取模规则一样。

关系运算符

在这里插入图片描述

==与equals

java: ==比较两个变量本身的值,即两个对象在内存中的首地址;equals 比较字符串中所包含的内容是否相同。

scala:==更加类似于 Java 中的 equals

逻辑运算符

在这里插入图片描述

赋值运算符

在这里插入图片描述

位运算符

在这里插入图片描述

流程控制

分支控制

if(条件表达式){
    执行代码块
}[else if(条件表达式){
    执行代码块
}][else{
    执行代码块
}]
object s03 {
  def main(args: Array[String]): Unit = {
    println("input age")
    var age=StdIn.readInt()
    if(age<18){
      println("童年")
    }else if(age>=18&&age<30){
      println("中年")
    }else{
      println("老年")
    }
  }
}

Scala 中 if else 表达式其实是有返回值的,具体返回值取决于满足条件的 代码体的最后一行内容。

val res:String=if(age<18){
              "童年"
            }else if(age>=18&&age<30){
              "中年"
            }else{
              "老年"
            }
    println(res)

Scala 中返回值类型不一致,取它们共同的祖先类型。

val res:Any=if(age<18){
              "童年"
            }else if(age>=18&&age<30){
              "中年"
            }else{
              100
            }
    println(res)

for循环

Scala 也为 for 循环这一常见的控制结构提供了非常多的特性,这些 for 循环的特性被称 为 for 推导式或 for 表达式。

for(变量<-a to b by c){//[a,b] 步长为 c
    todo
}
for(变量 <-a until b by c){//[a,b) 步长c
    todo
}

循环守护

循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环 体内部,为 false 则跳过,类似于 continue。

for(变量 <-a to b if 关于变量的条件语句){
    todo
}

循环返回值

val res = for(i <- 1 to 10) yield i
println(res)

将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。

while与do…while

与java相同

函数式编程

Scala 语言是一个完全面向对象编程语言。万物皆对象

对象的本质:对数据和行为的一个封装

Scala 语言是一个完全函数式编程语言。万物皆函数。

函数的本质:函数可以当做一个值进行传递

在这里插入图片描述

函数和方法的区别

方法有访问权限,函数没有访问权限

为完成某一功能的程序语句的集合,称为函数。

类中的函数称之方法。

函数没有重载和重写的概念;方法可以进行重载和重写

Scala 中函数可以嵌套定义

函数至简原则

函数至简原则:能省则省

  1. return 可以省略,Scala 会使用函数体的最后一行代码作为返回值
  2. 如果函数体只有一行代码,可以省略花括号
  3. 返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)。如果有 return,则不能省略返回值类型,必须指定
  4. 如果函数明确声明 unit,那么即使函数体中使用 return 关键字也不起作用
  5. Scala 如果期望是无返回值类型,可以省略等号
  6. 如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加
  7. 如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
  8. 如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

高级函数

  1. 函数可以作为值进行传递
  2. 函数可以作为参数进行传递
  3. 函数可以作为函数返回值返回

匿名函数

没有名字的函数就是匿名函数。

(x:Int)=>{函数体}

x:表示输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑

传递匿名函数至简原则:

  1. 参数的类型可以省略,会根据形参进行自动的推导
  2. 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参 数超过 1 的永远不能省略圆括号。
  3. 匿名函数如果只有一行,则大括号也可以省略
  4. 如果参数只出现一次,则参数省略且后面参数可以用_代替

闭包

如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的 环境,称为闭包。

object TestFunction {
 def main(args: Array[String]): Unit = {
 def f1()={
var a:Int = 10
 def f2(b:Int)={
 a + b
 }
 f2 _
 }
 // 在调用时,f1 函数执行完毕后,局部变量 a 应该随着栈空间释放掉
 val f = f1()
 // 但是在此处,变量 a 其实并没有释放,而是包含在了 f2 函数的内部,形成了闭合的效果
 println(f(3))
 
 println(f1()(3))
// 函数柯里化,其实就是将复杂的参数逻辑变得简单化,函数柯里化一定存
在闭包
 def f3()(b:Int)={
 a + b
 }
 println(f3()(3))
 }
}

函数柯里化

函数柯里化:把一个参数列表的多个参数,变成多个参数列表。

惰性加载

当函数被调用是先执行被调函数里的语句。

当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我们首次对此取值,该函 数才会执行。这种函数我们称之为惰性函数。

def main(args: Array[String]): Unit = {
 lazy val res = sum(10, 30)
 println("----------------")
 println("res=" + res)//只有res调用sum函数才执行
}
def sum(n1: Int, n2: Int): Int = {
 println("sum 被执行。。。")//只有res调用该语句才输出
 return n1 + n2
}

azy 不能修饰 var 类型的变量

面向对象

[修饰符]class 类名{
    类体
}

Scala 语法中,类并不声明为 public,所有这些类都具有公有可见性(即默认就是 public)

一个scala源文件可以包含多个类

创建对象

val | var 对象名[:类型]=new 类型()

val 修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值。

var 修饰对象,可以修改对象的引用和修改对象的属性值

自动推导变量类型不能多态,所以多态需要显示声明

构造器

Scala 类的构造器包括:主构造器和辅助构造器

class 类名(形参列表){//主构造器
    def this(形参列表){//辅助构造器
        
    }
}

辅助构造器,函数的名称 this,可以有多个,编译器通过参数的个数及类型 来区分。

辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。

构造器调用其他另外的构造器,要求被调用构造器必须提前声明。

构造器参数

Scala 类的主构造器函数的形参包括三种类型:未用任何修饰、var 修饰、val 修饰

  1. 未用任何修饰符修饰,这个参数就是一个局部变量 。
  2. var 修饰参数,作为类的成员属性使用,可以修改 。
  3. val 修饰参数,作为类只读属性使用,不能修改

继承

class Person(nameParam: String) {
 var name = nameParam
 var age: Int = _
 def this(nameParam: String, ageParam: Int) {
 this(nameParam)
 this.age = ageParam
 println("父类辅助构造器")
 }
 println("父类主构造器")
}
class Emp(nameParam: String, ageParam: Int) extends 
Person(nameParam, ageParam) {
 var empNo: Int = _
 def this(nameParam: String, ageParam: Int, empNoParam: Int) {
 this(nameParam, ageParam)
 this.empNo = empNoParam
 println("子类的辅助构造器")
 }
 println("子类主构造器")
}
object Test {
 def main(args: Array[String]): Unit = {
 new Emp("z3", 11,1001)
 }
}

特质

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

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

Scala 引入 trait 特征,第一可以替代 Java 的接口,第二个也是对单继承机制的一种 补充。

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

没有父类:class 类名 extends 特质 1 with 特质 2 with 特质 3 …

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

说明 :

  1. 类和特质的关系:使用继承的关系。
  2. 当一个类去继承特质时,第一个连接词是 extends,后面是 with。
  3. 如果一个类在同时继承特质和父类时,应当把父类写在 extends 后。

特质叠加

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

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

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

所谓的特质叠加,就是将混入的多个 trait 中的冲突方法叠加起来

trait Ball {
 def describe(): String = {
 "ball"
 }
}
trait Color extends Ball {
 override def describe(): String = {
 "blue-" + super.describe()
 }
}
trait Category extends Ball {
 override def describe(): String = {
 "foot-" + super.describe()
 }
}
class MyBall extends Category with Color {
 override def describe(): String = {
 "my ball is a " + super.describe()
 }
}
object TestTrait {
 def main(args: Array[String]): Unit = {
 println(new MyBall().describe())
 }
}
//结果:my ball is a blue-foot-ball

特质叠加执行顺序

上述案例中的 super.describe()调用的是父 trait 中的方法吗?

案例中的 super,不是表示其父特质对象,而是表示上述叠加顺序中的下一个特质, 即,MyClass 中的 super 指代 Color,Color 中的 super 指代 Category,Category 中的 super 指代 Ball。

如果想要调用某个指定的混入特质中的方法,可以增加约束:super[],例如 super[Category].describe()。

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

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

相关文章

4-20mA转RS-485,Modbus数据采集模块 YL121

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压1000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&#xff0c;…

equals与==判断相等

一、 判断相等&#xff0c;判断的是物理地址相等。 二、equals 判断相等 equals 与hashCode 都是Object的方法。 所有的类都继承于Object&#xff0c;如果不重写equals。equals判断相等&#xff0c;底层也是使用来判断物理地址相等。 public boolean equals(Object obj) {re…

影响MySQL索引B+树高度的是什么?

提到MySQL&#xff0c;想必大多后端同学都不会陌生&#xff0c;提到B树&#xff0c;想必还是有很大部分都知道InnoDB引擎的索引实现&#xff0c;利用了B树的数据结构。 那InnoDB 的一棵B树可以存放多少行数据&#xff1f;它又有多高呢&#xff1f; 到底是哪些因素会对此造成影…

【软件测试】测试人的职责,我就是不当背锅侠......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试的目的&#xf…

基于机器视觉的移动消防机器人(四)--实验验证

本文素材来源于北方民族大学 机电工程学院 作者&#xff1a;牟义达、黄瑞翔、李涛 指导老师&#xff1a;田国禾、张春涛 1. 自主行走功能验证 实验目的&#xff1a;让机器人小车行驶500ms后停500ms&#xff0c;循环重复。 实验器材&#xff1a;计算机、消防机器人小车。 实…

ACM MM ECCV 2022 | 美团视觉8篇论文揭秘内容领域的智能科技

人工智能技术正在成为内容领域的中台力量&#xff0c;其中视觉AI已经渗透到内容生产、内容审核、内容分发、用户互动、商业化变现等各个环节。美团视觉智能部以场景化的内容产品、智能化的内容工具助力产业&#xff0c;在内容的创作、内容分发等环节应用广泛。 前不久&#xff…

开源项目让你也可以尝试玩转工业物联网以及智慧工厂(智能制造),IOT开源网关、SCADA取数开源、PLC数据采集

物联网进入与传统产业深度融合发展的崭新阶段。未来10年内&#xff0c;全球物联网将创造10多万亿美元的价值&#xff0c;约占全球经济的1/10&#xff0c;并与城市管理、生产制造、汽车驾驶、能源环保等形成数个千亿级规模以上的细分市场。 随着物联网技术的快速发展&#xff0c…

win10怎么录屏?windows自带录屏功能怎么用

​相信很多小伙伴家里的电脑都是win10系统的&#xff0c;想要录制电脑上的画面&#xff0c;那么就需要用到了windows自带的录屏功能。win10怎么录屏&#xff1f;windows自带的录屏功能怎么用&#xff1f;别担心&#xff0c;今天小编就来教教大家如何在win10系统上录制电脑屏幕。…

Python程序员:代码写的好,丝滑的壁纸少不了

人生苦短&#xff0c;我用Python序言python批量下载最后序言 不知道大家的电脑桌面一般用的什么类型的壁纸&#xff1f; 早上来上班&#xff0c;打开电脑&#xff0c;被漂亮的桌面壁纸所吸引&#xff0c;年底将近&#xff0c;这又是哪个地方的节日&#xff1f; 才晓得&#x…

[附源码]java毕业设计美妆销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]java毕业设计农产品网络销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

论文阅读笔记 | 三维目标检测——F-PointNet算法

如有错误&#xff0c;恳请指出。 文章目录1. 背景2. 网络结构2.1 Frustum Proposal2.2 3D Instance Segmentation2.3 3D Box Estimation3. 实验结果paper&#xff1a;《Frustum PointNets for 3D Object Detection from RGB-D Data》1. 背景 基与鸟瞰图投影的方法&#xff08;…

一个小台灯

22年11月填旧坑 项目地址&#xff1a;myhome: 服务器终端和微信小程序 (gitee.com) 物联网台灯小项目——ILamp 1、主要硬件&#xff0c;STM32&#xff0c;ESP8266&#xff1b; 2、3D打印的外壳&#xff0c;淘宝金属灯杆、灯罩、配重块&#xff1b; 3、喷涂了白色油漆外观…

pytorch深度学习实战lesson20

第二十课 卷积层的多输入和多输出通道 目录 理论部分 多输入通道 多输出通道 实践部分 理论部分 多输入通道 假设图片大小是200*200的话&#xff0c;那么用张量表示这个图片的话就是200*200*3&#xff0c;因为彩色图片是由红、绿、蓝三个通道构成的&#xff0c;因此表示一…

看完这套Java笔记,才明白笔者同时斩获7份大厂offer是有原因的!

不知道各位程序员朋友有没有做笔记的习惯&#xff1f;不过&#xff0c;我觉得大家还是蛮喜欢收藏笔记的&#xff0c;嘿嘿&#xff0c;我也是。 前几天恰好看到一篇文章&#xff0c;里面详细罗列了关于Java的所有知识点。看目录&#xff0c;是从Jvm开始&#xff0c;再讲集合、多…

PHP使用阿里云对象存储oss

目录 1.使用composer安装依赖 2.编写代码 3.调用 4.遇到问题 (1) 上传成功 访问发现没有权限 (2) 接着访问&#xff0c;发现直接下载 (3) 上传文件 发现文件内容是空 5.自定义域名上传文件 (1) 配置&#xff1a; (2) 代码修改 1.使用composer安装依赖 composer requ…

技术笔记Android应用MediaPipe(一):Windows安装MediaPipe

一、MediaPipe概述 MediaPipe提供跨平台&#xff0c;为实时流媒体提供自定义的机器学习解决方案的应用框架。MediaPipe的主要特点&#xff1a; &#xff08;1&#xff09;端对端的加速&#xff1a;内置快速机器学习推理和处理&#xff0c;使得在普通硬件中也能加速使用。 &…

电瓶车、汽车智慧充电站可提高运营利润,缩短投资回收周期!

安科瑞 李可欣 具体可咨询&#xff1a;Acrel_lkx 需求分析 传统充电站现状 充电站用户需求 建设智慧充电站&#xff0c;解决传统充电站痛点 安科瑞充电站解决方案 保障配电可靠&#xff0c;解决运维难的问题&#xff0c;降低人力成本 确保用电安全&#xff0c;及时切除隐患…

数云融合丨重构传统商贸数字化解决方案

随着5G技术的高速发展&#xff0c;我们迎来了数字化的新阶段&#xff0c;中国也正在加快步入新的消费时代。 数字化的发展带来的多元下消费力的提升&#xff0c;让传统商贸行业迎来数字化产业升级的十字路口&#xff0c;今天我们就来聊一聊数字化对传统商贸的重构。 传统商贸面…

LQ0204 振兴中华【递归】

题目来源&#xff1a;蓝桥杯2013初赛 C A组C题 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明参加了学校的趣味运动会&#xff0c;其中的一个项目是&#xff1a;跳格子。 地上画着一些格子&#xff0c;每个…