文章目录
1.处理数据的类型划分
- 字面量(literal):直接出现在源代码中的数据,如数字5,字母’A’,文本"hello world"
- 值(value):是一个不可变的、有类型的存储单元
- 变量(variable):是一个可变的、有类型的存储单元
- 类型(type):是所处理数据的种类(kind),这是对数据的一个定义或分类
在scala中,如果某些值和变量不再使用,将由Java虚拟机的垃圾回收系统自动撤销其中存储的数据。不能手动地撤销值和变量
2.处理数据的语法
- 定义值(不可变)的语法:
val <name>:<type> = <literal>
使用这个值:
类型推导:在定义值时,可以不显示指定类型,这样scala编译器将从赋值判断这个值的类型(例如20——Int,’@’——Char,“Hello,world”——String )
- 定义变量(可变)的语法:
var <name>:<type> = <literal>
相对来说,值的使用场景要大于变量:
- 值:主要适用于大部分场景(在并发或者多线程访问时,不可变的值会更加稳定)。
- 变量:主要适用于存储临时数据或者在循环中累加值的局部变量。
3.命名
- 一个字母后跟有0个或多个字母和数字
- 一个字母后跟有0个或多个字母和数字,然后是一个下划线(_),后面是一个或多个字母和数字,或者一个或多个操作符字符
- 一个或多个操作符字符
- 一个或多个除反引号外的任意字符,所有这些字符要包围在一对反引号中
4.类型
Scala包括数值类型(例如Int和Double)和非数值类型(例如String),可以用来定义值和变量
类型名 | 描述 | 大小 |
Byte | 有符号整数 | 1字节 |
Short | 有符号整数 | 2字节 |
Int | 有符号整数 | 4字节 |
Long | 有符号整数 | 8字节 |
Float | 有符号浮点数 | 4字节 |
Double | 有符号浮点数 | 8字节 |
Scala支持根据类型等级自动将数字从一种类型转换到另一种类型,如下所示:
此为向上转换(即自动转换到更高等级)。
Scala不允许从较高等级类型自动转换到较低等级类型,不然会受到存储空间的影响,丢失数据。
但是,可以选择使用toType
方法手动完成类型间的转换,所有数值类型都有这样一个方法,如下所示:
除了使用显式类型,还有一种方法是使用Scala的字面量类型记法,直接指定字面量数据的类型:
字面量 | 类型 | 概述 |
5 | Int | 默认为无修饰(前缀或后缀)的整数字面量是Int类型 |
0x0f | Int | "0x"前缀指示十六进制记法 |
5l | Long | “l”后缀表示Long类型 |
5.0 | Double | 默认为无修饰(前缀或后缀)的小数字面量是Double类型 |
5f | Float | "f"后缀指示Float类型 |
5d | Double | "d"后缀指示Double类型 |
Scala的字面量类型中可以使用小写或大写字符,例如字面量数字5l与字面量数字5L是相同的。
5.字符串
Scala的String建立在Java的String基础上,另外增加了多行字面量和字符串内插等特有的特性。
与数值类型类似,String类型也支持使用数学运算符,例如:
可以用三重引号创建多行String,例如:
另外,如果要根据其他值建立一个String,利用字符串相加就很容易做到,例如:
字符串内插:要在一个String中加入值或变量,更直接的一种方法是利用字符串内插(string interpolation),这是一种特殊的模式,采用这种模式可以识别和解析外部值和变量名。
Scala的字符串内插记法是在字符串的第一个双引号前面增加一个"s"前缀,然后可以使用美元符($)指示外部数据的引用(可以有可选的大括号),如下所示:
如果引用中有非字(nonword)字符(如算式),或者如果引用与周围文本无法区分,就需要使用可选的大括号,如下所示:
printf记法:字符串内插的替代格式是使用printf记法,想要控制数据格式化时,如字符个数或小数值的显示,这种记法非常有用。要使用printf记法,需要把前缀改为"f",然后将printf记法紧跟在引用后面;
6.正则表达式
正则表达式是字符和标点符号组成的一个字符串,表示一个搜索模式。
Scala正则表达式的格式基于Java类java.util.regex.Pattern,String类型提供了很多支持正则表达式的内置操作,如下所示:
操作名 | 描述 |
matches | 如果正则表达式与整个字符串匹配,返回true |
replaceAll | 用替换文本取代所有匹配文本 |
replaceFirst | 用替换文本取代第一个匹配文本 |
利用捕获组,可以选择一个给定字符串中的项,根据正则表达式将它们转换为本地址。这个模式必须至少包括一个捕获组,由小括号定义,输入则至少包括一个被捕获模式来返回相应的值
语法:
7.Scala类型概述
图中的空心三角箭头表示超类型,图下方带多个箭头的类型指示它们是这个系统中所有类型(包括你自己定义的类)的子类型
类型名 | 描述 | 可否实例化 |
Any | Scala中所有类型的根 | 否 |
AnyVal | 所有值类型的根 | 否 |
AnyRef | 所有引用(非值)的根 | 否 |
Nothing | 所有类型的子类 | 否 |
Null | 所有指示null值的AnyRef类型的子类 | 否 |
Char | Unicode字符 | 是 |
Boolean | true或false | 是 |
String | 字符串(即文本) | 是 |
Unit | 指示没有值 | 否 |
常用类型操作:
操作名 | 描述 |
asInstanceOf[] | 将一个值转换为指定类型的值。如果这个值与新类型不兼容,会导致一个错误 |
getClass | 返回一个值的类型(即类) |
isInstanceOf[] | 如果这个值有给定的类型,则返回true |
hashCode | 返回这个值的散列码,这对于基于散列的集合很有用 |
to | 转换函数,可以将一个值转换为另一个兼容的值 |
toString | 将值显示为一个字符串 |
注意:尽量使用to而不要使用asInstanceOf,因为如果值无法转换为所请求的类型,asInstanceOf操作就会导致一个错误
8.元组
元组是一个包含两个或多个值的有序容器,所有这些值可以有不同的类型。如果需要对值逻辑分组,将它们表示为一个统一的单位,元组就很有用。不过,元组的作用仅限于作为多个值的容器
创建元组时,值之间要用逗号分隔,并用一对小括号包围。
语法:
(<value 1>,<value 2>[,<value 3>…])
可以通过元素的索引(从1开始)访问元组中的单个元素,如下所示:
也可以使用关系操作符(->)来创建元组,如下所示:
元组提供了一种建立数据结构的通用方法,如果要对离散的元素进行分组以便处理,元组会很有用
9.练习
- 编写一个新的摄氏度到华氏度转换的程序,把每一步转换的结果保存在单独的值中
- 使用输入值2.755,生成字符串“You owe $2.76”
- 将数字128转换为一个Char、String、Double,再转换为Int