文章目录

1.处理数据的类型划分

  • 字面量(literal):直接出现在源代码中的数据,如数字5,字母’A’,文本"hello world"
  • 值(value):是一个不可变的、有类型的存储单元
  • 变量(variable):是一个可变的、有类型的存储单元
  • 类型(type):是所处理数据的种类(kind),这是对数据的一个定义或分类

在scala中,如果某些值和变量不再使用,将由Java虚拟机的垃圾回收系统自动撤销其中存储的数据。不能手动地撤销值和变量

2.处理数据的语法

  • 定义值(不可变)的语法:​​val <name>:<type> = <literal>​

Scala学习记录——2.Scala的数据_字符串

使用这个值:

Scala学习记录——2.Scala的数据_数据_02

类型推导:在定义值时,可以不显示指定类型,这样scala编译器将从赋值判断这个值的类型(例如20——Int,’@’——Char,“Hello,world”——String )

  • 定义变量(可变)的语法:​​var <name>:<type> = <literal>​

Scala学习记录——2.Scala的数据_scala_03

相对来说,值的使用场景要大于变量:

  • 值:主要适用于大部分场景(在并发或者多线程访问时,不可变的值会更加稳定)。
  • 变量:主要适用于存储临时数据或者在循环中累加值的局部变量。

3.命名

  • 一个字母后跟有0个或多个字母和数字
  • 一个字母后跟有0个或多个字母和数字,然后是一个下划线(_),后面是一个或多个字母和数字,或者一个或多个操作符字符
  • 一个或多个操作符字符
  • 一个或多个除反引号外的任意字符,所有这些字符要包围在一对反引号中

4.类型

Scala包括数值类型(例如Int和Double)和非数值类型(例如String),可以用来定义值和变量

类型名

描述

大小

Byte

有符号整数

1字节

Short

有符号整数

2字节

Int

有符号整数

4字节

Long

有符号整数

8字节

Float

有符号浮点数

4字节

Double

有符号浮点数

8字节

Scala支持根据类型等级自动将数字从一种类型转换到另一种类型,如下所示:

Scala学习记录——2.Scala的数据_Scala_04

此为向上转换(即自动转换到更高等级)。

Scala不允许从较高等级类型自动转换到较低等级类型,不然会受到存储空间的影响,丢失数据。

但是,可以选择使用​​toType​​方法手动完成类型间的转换,所有数值类型都有这样一个方法,如下所示:

Scala学习记录——2.Scala的数据_Scala_05

除了使用显式类型,还有一种方法是使用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基础上,另外增加了多行字面量和字符串内插等特有的特性。

Scala学习记录——2.Scala的数据_scala_06


与数值类型类似,String类型也支持使用数学运算符,例如:

Scala学习记录——2.Scala的数据_Scala_07

可以用三重引号创建多行String,例如:

Scala学习记录——2.Scala的数据_数据_08


另外,如果要根据其他值建立一个String,利用字符串相加就很容易做到,例如:

Scala学习记录——2.Scala的数据_scala_09

字符串内插:要在一个String中加入值或变量,更直接的一种方法是利用字符串内插(string interpolation),这是一种特殊的模式,采用这种模式可以识别和解析外部值和变量名。

Scala的字符串内插记法是在字符串的第一个双引号前面增加一个"s"前缀,然后可以使用美元符($)指示外部数据的引用(可以有可选的大括号),如下所示:

Scala学习记录——2.Scala的数据_数据_10

如果引用中有非字(nonword)字符(如算式),或者如果引用与周围文本无法区分,就需要使用可选的大括号,如下所示:

Scala学习记录——2.Scala的数据_scala_11


printf记法:字符串内插的替代格式是使用printf记法,想要控制数据格式化时,如字符个数或小数值的显示,这种记法非常有用。要使用printf记法,需要把前缀改为"f",然后将printf记法紧跟在引用后面;

Scala学习记录——2.Scala的数据_Scala_12

6.正则表达式

正则表达式是字符和标点符号组成的一个字符串,表示一个搜索模式。

Scala正则表达式的格式基于Java类java.util.regex.Pattern,String类型提供了很多支持正则表达式的内置操作,如下所示:

操作名

描述

matches

如果正则表达式与整个字符串匹配,返回true

replaceAll

用替换文本取代所有匹配文本

replaceFirst

用替换文本取代第一个匹配文本

利用捕获组,可以选择一个给定字符串中的项,根据正则表达式将它们转换为本地址。这个模式必须至少包括一个捕获组,由小括号定义,输入则至少包括一个被捕获模式来返回相应的值

语法:

val <Regex value>(<identifier>) = <input string>

Scala学习记录——2.Scala的数据_scala_13

7.Scala类型概述

Scala学习记录——2.Scala的数据_字符串_14

图中的空心三角箭头表示超类型,图下方带多个箭头的类型指示它们是这个系统中所有类型(包括你自己定义的类)的子类型

类型名

描述

可否实例化

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开始)访问元组中的单个元素,如下所示:

Scala学习记录——2.Scala的数据_数据_15

也可以使用关系操作符(->)来创建元组,如下所示:

Scala学习记录——2.Scala的数据_数据_16

元组提供了一种建立数据结构的通用方法,如果要对离散的元素进行分组以便处理,元组会很有用

9.练习

  1. 编写一个新的摄氏度到华氏度转换的程序,把每一步转换的结果保存在单独的值中

Scala学习记录——2.Scala的数据_数据_17

  1. 使用输入值2.755,生成字符串“You owe $2.76”

Scala学习记录——2.Scala的数据_scala_18

  1. 将数字128转换为一个Char、String、Double,再转换为Int

Scala学习记录——2.Scala的数据_Scala_19