Scala:
变量声明、基本数据类型、运算符、文件读写、分支与循环、数据结构(List/Tuple/Range/Vector/Set/Map)与迭代器
-
变量声明
- val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值(赋值报错)
- var:是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值
- 显式声明变量的类型
Scala具有“类型推断”能力(类型推断机制),可以自动推断出变量的类型。
Scala 解释器输入多行代码:
通常而言,只要Scala解释器推断出你的代码还没有结束,应该延续到下一行,解释器就会在下一行显示一个竖线“|”,可以继续输入剩余的代码,比如,我们要输入表达式val str = “Hello World!”,我们只在命令提示符后面输入“val str = ”然后就回车,显然,这个表达式还没有结束,所以解释器会在下一行显示一个竖线“|”,可以在第2行继续输入”Hello World!”然后回车,解释器就会得到执行结果。
- val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值(赋值报错)
-
基本数据类型
- Scala的数据类型包括:Byte、Char、Short、Int、Long、Float、Double、Boolean
注:
在 Scala,这些类型都是“类”,并且都是包 scala 的成员,如 scala.Int;
对于字符串,Scala用java.lang.String类来表示字符串,自己并未定义;- 字面量
- 字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量
- Scala允许对“字面量”直接执行方法
- 字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量
-
运算符
- 算术运算符:在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等算术操作符,而且,这些操作符就是方法;
注:和Java不同,在Scala中并没有提供++和–操作符,需要采用+=形式
- 关系运算符
- 大于(>)、小于(<)、大于等于(>=)和小于等于(<=)
- 大于(>)、小于(<)、大于等于(>=)和小于等于(<=)
- 逻辑运算符:&&、||、!
- 位运算符:&、|、^(按位异或)、-(按位取反)
- 算术运算符:在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等算术操作符,而且,这些操作符就是方法;
-
输入输出
- 输入
- readInt、readFloat等
- readInt、readFloat等
- 输出:print println printf (scala.Predef)
- 插值字符串
- 输入
-
读写文件
- 写文本文件:java.io.PrintWriter
new PrintWriter(“output.txt”)中只给出了文件名,并没有给出文件路径,采用相对路径,这时文件就会被保存到启动Scala REPL时的当前目录下;如果我们想把文件保存到一个指定的目录下,就需要给出文件路径。
- 读文本文件:使用scala.io.Source的getLines方法
- 写文本文件:java.io.PrintWriter
-
分支与循环
-
if
- vim if_try.scala
注:
上述形式代码直接scala filename.scala即可;
与Java不同的是,Scala中的if表达式的值可以赋值给变量;
- vim if_try.scala
-
while
- 1:
- 2:do while
- 1:
-
for
- 格式:for (变量<-表达式) 语句块;
"变量<-表达式"被称为生成器(generator);
-
例:
- 打印1到5
注:i 不需要提前进行变量声明
-
打印1到5之间的奇数
-
打印1到5之间的偶数:守卫(guard)表达式
-
Scala 多生成器
-
多生成器&守卫表达式
-
for 推导式:yield
带有yield关键字的for循环,被称为“for推导式”。这个概念源自函数式编程,也就是说,通过for循环遍历一个或多个集合,对集合中的元素进行“推导”,从而计算得到新的集合,用于后续的其他处理。
- 打印1到5
-
Scala无break与continue,解决方法如下
break:
continue:
-
-
异常捕获:Scala异常为不受检异常,try catch
-
数据结构
-
Array
- 声明一个长度为3的整型数组并赋值
需要注意的是,在Scala中,对数组元素的应用,是使用圆括号,而不是方括号
- 声明一个长度为2的字符串数组
- 更加简洁的数组声明和初始化方法
- 多维数组
- 声明一个长度为3的整型数组并赋值
-
Tuple(Scala 元祖)
当需要访问元组中的某个元素的值时,可以通过类似tuple._1、tuple._2、tuple._3这种方式就可以实现
-
List
注:
列表有头部和尾部的概念,可以使用arr.head来获取上面定义的列表的头部(第一个),使用arr.tail来获取上面定义的列表的尾部(除第一个);
我们可以使用::操作(右结合的),在列表的头部增加新的元素,得到一个新的列表;
Nil表示空列表; -
Vector
+:与:+
-
Range(在执行for循环时,我们经常会用到数值序列,可以使用range实现)
- 创建一个从1到5的数值序列,包含区间终点5,步长为1:to
- 创建一个从1到5的数值序列,不包含区间终点5,步长为1:Until
- 创建一个从1到10的数值序列,包含区间终点10,步长为2:to、by
- 创建一个从0.5到5.6的浮点序列,步长为0.3:to、by
- 创建一个从1到5的数值序列,包含区间终点5,步长为1:to
-
Set(不重复,无序,以“哈希”方法对元素的值进行组织)
- 不可变集(缺省情况下创建的是不可变集)
即使是可变类型变量(var),myset还是不可变集:
myset += “d” 是新的不可变集赋值给可变的变量myset;
如果使用val,mySet +=“Scala”执行时会报错,因为val声明的变量不可变;- 可变集
如果要声明一个可变集,则需要引入scala.collection.mutable.Set包
声明myMutableSet为val变量(不是var变量),由于是可变集,因此,可以正确执行myMutableSet += “Cloud Computing”,不会报错,可以这样理解,myMutableSet变量指向的可变集改变了,即加了一个Cloud Computing。注意:虽然可变集和不可变集都有添加或删除元素的操作,但是二者有很大的区别。对不可变集进行操作,会产生一个新的集,原来的集并不会发生变化。 而对可变集进行操作,改变的是该集本身。
- 不可变集(缺省情况下创建的是不可变集)
-
Map
- 不可变映射(默认情况下创建的是不可变映射)
上面我们定义的是不可变映射,是无法更新映射中的元素的,也无法增加新的元素
- 可变映射(如果需要创建可变映射,需要引入scala.collection.mutable.Map包)
- 循环遍历映射
- 基本格式:for ((k,v) <- 映射) 语句块
- 遍历打印key、value
- 遍历打印key
- 遍历打印value
- 不可变映射(默认情况下创建的是不可变映射)
-
-
迭代器
- 在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法。当构建一个集合需要很大的开销时(比如把一个文件的所有行都读取内存),迭代器就可以发挥很好的作用。
- 在Scala中,迭代器(Iterator)不是一个集合,但是,提供了访问集合的一种方法。当构建一个集合需要很大的开销时(比如把一个文件的所有行都读取内存),迭代器就可以发挥很好的作用。
>>> Scale 编程基础 B(面向对象编程)
>>> Scale 编程基础 C(函数式编程)
中国大学MOOC-厦门大学林子雨-Spark编程基础(侵删)