一. 常见数据类型
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32 位, IEEE 754 标准的单精度浮点数 |
Double | 64 位 IEEE 754 标准的双精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。 |
Null | null 或空引用 |
Nothing | Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
注:scala中数据类型均为首字母大写。
类型推断:Scala会区分不同类型的值,并且会基于使用值的方式来确定其类型。
二. 变量与常量
1. 变量:在程序运行过程中值可能发生改变的量叫做变量。
var 变量名 = 初始值
var 变量名 : 数据类型 = 初始值
2. 常量:在程序运行过程中值不会发生变化的量叫做常量。
val 变量名 = 初始值
val 变量名 : 数据类型 = 初始值
三. 运算符
算术 运算符 | + | 两个数相加(字符串拼接) | 1+2或1.+(2) |
- | 两个数相减 | 1-2或1.-(2) | |
* | 两个数相乘 | 1*2或1.*(2) | |
/ | 两个数相除(整数相除得整数解) | 1/2或1./(2) | |
% | 两个数取余 | 1%2或1.%(2) | |
关系 运算符 | > | 判断左值是否大于右值,true为真,false为假 | 1>2或1.>(2) |
< | 判断左值是否小于右值,true为真,false为假 | 1<2或1.<(2) | |
>= | 判断左值是否大于等于右值,true为真,false为假 | 1>=(2)或1.>=(2) | |
<= | 判断左值是否小于等于右值,true为真,false为假 | 1<=(2)或1.<=(2) | |
== | 判断左值是否等于右值,true为真,false为假 | 1==2或1.==(2) | |
!= | 判断左值是否不等于右值,true为真,false为假 | 1!=2或1.!=(2) |
逻辑 运算符 | && | 且/与(一假为假,两真为真) | 1>2 && 2>3 或 1>2.&&(2>3) |
|| | 或(一真为真,两假为假) | 1>2 || 2>3 或 1>2.||(2>3) | |
! | 非,取反 | !(1>2) | |
位 运算符 | & | 按二进制位进行与运算,两位同时为1结果才为1,否则为0 | 0 & 1或0.&(1) |
| | 按二进制位进行或运算,两位只要有一个为1则结果为1 | 0 | 1或0.&(1) | |
^ | 按二进制位进行异或运算,两位不同时为1,相同时为0 | 0^1或0.^(1) |
赋值 运算符 | = | 将右侧的值赋于左侧 | var num = 2 |
-= | 执行加法后再赋值左侧 | a += 2 | |
+= | 执行减法后再赋值左侧 | a -= 1 | |
*= | 执行乘法后再赋值左侧 | a *= 2 | |
/= | 执行除法后再赋值左侧 | a /= 3 | |
%= | 执行取余后再赋值左侧 | a %= 5 | |
>>= | 左移位后赋值左侧 | a <<= 2 | |
<<= | 右移位后赋值左侧 | a >>= 2 | |
&= | 按位运算与后赋值左侧 | a &= 2 | |
|= | 按位运算与后赋值左侧 | a ^= 2 | |
^= | 按位运算或后赋值左侧 | a |= 2 |
四. 数组(Array)
1. 定义:Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组中某个指定的元素是通过索引来访问的,数组的第一个元素索引为0,最后一个元素的索引为元素总数减1。
# 定义
val 数组名 : Array[元素类型] = new Array[元素类型](长度)
val 数组名 : Array[元素类型] = Array(值1,值2…值n)
# 赋值
数组名(索引) = 值
# 获取
数组名(索引)
2. 基本操作:
基本操作 | 描述 |
数组名.length | 返回数组的长度 |
数组名.head | 查看数组第一个元素 |
数组名.tail | 查看数组除了第一个元素剩下的元素 |
数组名.isEmpty | 判断数组是否为空 |
3. 常用方法:
数组方法使用需要提前导包,以下方式:
- import Array._ 引入Array中所有的成员,后面可多次调用
- import Array.range 引入Array的range成员,后面可多次调用
- Array.range(参数列表) 一次性调用
- import Array.range 引入Array的range成员,后面可多次调用
方法 | 描述 |
数组名.contains(值) | 判断数组是否包含元素x,返回布尔类型的值 |
concat( 数组1, 数组2… 数组n ) | 合并数组,返回新的数组 |
数组名.mkString(连接符) | 通过连接符转为字符串,返回字符串 |
range( 起始值, 结束值) | 创建指定区间内的数组 |
range( 起始值, 结束值, 步长) | 按步长创建指定区间内的数组 |
ofDim[元素类型]( 行数, 列数) | 创建二维数组 |
4. 定义多维数组:多维数组一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。
# 定义二维数组
val 数组名 : Array[Array[元素类型]] = Array(Array(值1,值2…), Array(值1,值2…) …)
val 数组名 = Array.ofDim[元素类型](行数,列数)
# 赋值
数组名(索引)(索引) = 值
# 获取
数组名(索引)(索引)
注:合并数组也可以使用操作符“++”
五. 函数
def 函数名 ([参数列表]) : [返回值类型] = {
方法体
[return 返回值]
}
def 函数名 ([参数列表]) : [返回值类型] = 方法体/{ 方法体 }
函数一旦定义完成,可通过函数名调用函数。
匿名函数:是在定义函数的时候不给出函数名。匿名函数是使用箭头“=>”定义的,箭头的左边是参数列表,箭头右边是表达式,表达式将产生函数的结果。
调用匿名函数:可以将函数赋值给一个常量或变量,然后通过常量名或变量名调用该函数
高阶函数:就是操作其他函数的函数。高阶函数可以使用函数作为参数,也可以使用函数作为输出结果。高阶函数经常将只需要执行一次的函数定义为匿名函数作为参数。
递归函数:
柯里化(Currying):指将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。