Scala语言数据类型与集合
1、常见数据类型
-
Scala的常用数据类型注意:在Scala中,任何数据都是对象。
例如:
-
数值类型: Byte,Short,Int,Long,Float,Double等
- Byte: 8位有符号数字,从-128 到 127
- Short: 16位有符号数据,从-32768 到 32767
- Int: 32位有符号数据
- Long: 64位有符号数据
例如:
val a:Byte = 10
a+10
得到:res9: Int = 20
这里的res9是新生成变量的名字
val b:Short = 20
a+b
注意:在Scala中,定义变量可以不指定类型,因为Scala会进行类型的自动推导。
-
字符类型和字符串类型:Char和String
对于字符串,在Scala中可以进行插值操作。
注意:前面有个s;相当于执行:"My Name is " + s1
-
Unit类型:相当于Java中的void类型
-
Nothing类型:一般表示在执行过程中,产生了Exception
例如,我们定义一个函数如下:
2、Scala变量的申明和使用
- 使用val和var申明变量
例如:scala> val answer = 8 * 3 + 2 可以在后续表达式中使用这些名称 - val:定义的值实际是一个常量
- var:要申明其值可变的变量
- 注意:
可以不用显式指定变量的类型,Scala会进行自动的类型推到
3、Scala的函数和方法的使用
-
可以使用Scala的预定义函数
例如:求两个值的最大值
- 也可以使用def关键字自定义函数
语法:
示例:
- 也可以使用def关键字自定义函数
4、Scala的条件表达式
- Scala的if/else语法结构和Java或C++一样。
- 不过,在Scala中,if/else是表达式,有值,这个值就是跟在if或else之后的表达式的值。
5、Scala的循环
Scala拥有与Java和C++相同的while和do循环
Scala中,可以使用for和foreach进行迭代
- 使用for循环案例:
注意:
(1) <- 表示Scala中的generator,即:提取符
(2)第三种写法是第二种写法的简写 - 在for循环中,还可以使用yield关键字来产生一个新的集合
在上面的案例中,我们将list集合中的每个元素转换成了大写,并且使用yield关键字生成了一个新的集合。 - 使用while循环:
注意使用小括号,不是中括号
- 使用do … while循环
- 使用foreach进行迭代
注意:在上面的例子中,foreach接收了另一个函数(println)作为值6、Scala函数的参数
- Scala中,有两种函数参数的求值策略
- Call By Value:对函数实参求值,且仅求一次
- Call By Name:函数实参每次在函数体内被用到时都会求值
- 我们来分析一下,上面两个调用执行的过程:
-
一份复杂一点的例子:
- Scala中的函数参数
- 默认参数
- 代名参数
- 可变参数
- Scala中的函数参数
6、Scala的Lazy值(懒值)
当val被申明为lazy时,它的初始化将被推迟,直到我们首次对它取值。
一个更为复杂一点的例子:读取文件:
7、异常的处理
Scala异常的工作机制和Java或者C++一样。直接使用throw关键字抛出异常。
使用try…catch…finally来捕获和处理异常:
8、Scala中的数组
- Scala数组的类型:
- 定长数组:使用关键字Array
- 变长数组:使用关键字ArrayBuffer
- 遍历数组
- Scala数组的常用操作
- Scala的多维数组
和Java一样,多维数组是通过数组的数组来实现的。也可以创建不规则的数组,每一行的长度各不相同。
- 定长数组:使用关键字Array
9、映射
映射就是Map集合,由一个(key,value)组成。->
操作符用来创建
例如:
val scores = Map(“Alice” -> 10,”Bob” -> 3,”Cindy” -> 8)
映射的类型分为:不可变Map
和可变Map
- 映射的操作
- 获取映射中的值
- 更新映射中的值(
必须是可变Map
)
- 迭代映射
- 获取映射中的值
10、元组(Tuple)
元组是不同类型的值的聚集。
例如:val t = (1, 3.14, “Fred”) // 类型为Tuple3[Int, Double, java.lang.String]
这里:Tuple是类型,3是表示元组中有三个元素。
元组的访问和遍历:
注意:要遍历Tuple中的元素,需要首先生成对应的迭代器。不能直接使用for或者foreach