Scala基础

发布时间 2023-08-13 09:13:51作者: 昵称已经被使用

快学Scala笔记

第1章、基础

简介:Scala是一门以java虚拟机(JVM)为目标运行环境并将面对面向对象和函数式编程语言的最佳特征结合在一起的编程语言。

优点:有动态语言的灵活简洁,保留了静态类型检查带来的安全保障和执行效率,能处理脚本化的临时任务,又能处理高并发场景下的分布式互联网大数据应用。Scala 代码一般都很短,号称达到相同功能代码量能缩减到java 代码量的1/10。

特性:函数可以在任何地方定义;Scala提倡使用val定义变量,由于变量值是不可变的,对值操作,原值不变产生新值;Scala提倡尾递归。

1.1 环境安装

1.1.1 安装jdk(版本别安装太新,如果太新,可能导致后面不兼容)

见jdk安装.md

1.1.2 Scala环境安装

(1)、下载与安装scala

下载地址:https://www.scala-lang.org/download/

image-20200111211541044

(2)、安装完后,点击桌面计算机,右键属性,在左边点击“高级系统设置”,点击 高级->环境变量,这是点击下面的系统环境变量->修改Path,找到你安装Scala的路径,拷贝到变量值中,注意以“;”隔开
变量名 path
变量值 E:\scala\bin(该值是 Scala 的具体安装路径 )

image-20200111211710924

(3)、配置环境变量后,win+R并输入cmd打开DOS操作系统,在DOS中输入scala

image-20200111212556226

1.2 Scala解释器

Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。从技术上讲,scala程序并不是一个解释器。实际发生的是,你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。正因为如此,大多数scala程序员更倾向于将它称做“REPL”。
REPL:Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环);

在scala>命令行内,键入scala代码,解释器会直接返回结果给你, 如果你没有指定变量来存放这个值,那么值默认的名称为res,而且会显示结果的数据类型

scala> 8 * 5 + 2
res0: Int = 42

1.2.1 REPL模式

paste mode:最常用的一种模式,粘贴多行程序时很方便
:paste可以缩写为:pas
ctrl + d 运行退出

silent mode:安静模式,不会输出每个表达式的类型和值;在定义变量时如果不想要输出,可以用:silent启用安静模式;退出安静模式也用 :silent

power mode:这个模式并不针对普通用户,并且 cpu 耗费很高,通常用不着

:help 查看 repl 使用方法

1.2.2 REPL使用

REPL 下无法定义package:脚本其实是在一个对象的方法中运行的,定义package自然是非法的

获取 jvm 系统属性:

sys.props.foreach(println)

REPL 启动的 jvm参数通过 -J来设定(基本用不到)

scala -J-Xms1g -J-Xmx1G

REPL 设置 classpath

scala -cp /data/demo/whj.jar

1.3声明变量和值

Scala 里所有变量都是指向变量的引用,变量声明为val 意味着它是个不变引用;
所有方法参数都是不变引用;
类参数默认是不变引用

创建可变引用唯一方法是使用var关键字

1.4常用类型

1.4.1 区分

image-20200111220557950

scala 并不刻意的区分基本类型和引用类型(java 中强烈区分,int 和 Integer)

image-20200111220722874

1.4.2常用类型转换为加强型

数据类型 数据类型加强类
Byte scala.runtime.RichByte
Short scala.runtime.RichShort
Int scala.runtime.RichInt
Long scala.runtime.RichLong
Char scala.runtime.RichChar
String scala.collection.immutable.StringOps
Float scala.runtime.RichFloat
Double scala.runtime. RichDouble
Boolean scala.runtime.RichBoolean

Scala 会自动为每个程序加上几个隐式引用,就像Java程序会自动加上 java.lang 包一样。Scala 中,以下三个包的内容会隐式引用到每个程序上。
在 Predef 的父类 LowPriorityImplicits 定义了 隐式转换,提供了 Int 类型像Rich 类型的转换

1.4.3常用特殊类型

image-20200111221724504

Unit通常只用来声明函数或方法的返回值(表示没有返回值),其他场景基本是没有意义的

Scala.Null 是null 的引用对象类型它是每个继承自AnyRef 的类的子类

Nothing 在Scala 的类层级的最底端,是任何其他类型的子类型,然而这个类型根本没有这个类型的任何值Noting 用处标明了异常终止 predef 定义了一个error 方法

def error(msg: String): Nothing = 
  throw new RuntimeException(message)

error 返回类型是Nothing 告诉用户是不正常返回;又由于 Nothing 是任意类型的子类型,所以你可以这样使用

def divide(x: Int, y: Int)=
	If(y != 0) x/y
	else error(“can’t divide by zero!”)

BigInt 和BigDecimal 是借助于java.math包下的BigInteger 和 BigDecimal 实现的类型

Any(abstract)是所有Scala 类型的父类型,定义了通用方法 equals、hashCode、toStirng。Any有两个子类型AnyRef 和 AnyVal

AnyVal所有值类型,Scala定义类9种非空值类型

AnyRef(class)所有引用类型的父类,可以看作是java.lang.Object的别名。

1.4.4类型匹配

image-20200111222316132

1.5算术和操作符重载

+-*/%与位操作符&|^>><<实际上是方法,且操作符是可以重载的

方法调用:
a 方法 b

a.方法(b)

scala> 8 * 5
res1: Int = 40
scala> 8 .*(5)
res3: Int = 40

1.6调用函数和方法

使用以scala.开头的包时,可以省去scala前缀。例如:import math._等同于import scala.math.,而math.方法()等同于scala.math.方法();_字符时通配符,相当于JAVA中的*。

scala没有静态方法,但有单列对象(详情见对象章节)
通常,一个类对应一个伴生对象,其方法与静态方法一样
一般来讲,没有参数且不改变当前对象的方法不带圆括号

1.7Apply方法

Scala 中常常通过伴生对象的Apply 方法构建对象,通常apply 方法返回的是伴生类的对象
例如:scala 中Array 实例化 Array(1,2,3) 比构造器方便之处在于省掉了new 关键字,Array(Array(1,7),Array(2,5))
Array(100) 和 new Array(100) 有非常大的差别,前者表示实例化一个Array ,Array里面包含一个元素100,后者 表示实例化一个容量为100 的Array,每一个元素都是Null
Scala 通过类和同名的“伴生”对象来达到实例方法和静态方法并存的类。