为什么要学习scala?
Spark—新一代内存级大数据计算框架,是大数据处理的重要框架。Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。
scala语言的特点
Scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
-
Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程。
-
Scala可以说是源于java,Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。
-
Scala 单作为一门语言来看, 非常的简洁高效。
Scala程序开发注意事项
-
Scala源文件以 “.scala" 为扩展名
-
Scala程序的执行入口是main()函数
-
Scala语言严格区分大小写。
-
Scala方法由一条条语句构成,每个语句后不需要分号(Scala语言会在每行后自动加分号),这也体现出Scala的简洁性。
-
如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号(尽量一行就写一条语句)。
变量
1、变量的基本使用
变量声明基本语法:var | val 变量名 [: 变量类型] = 变量值,例:var num:Int=1
注意事项:
1)声明变量时,类型可以省略(就是叫 类型推断)
2)类型确定后,就不能修改,说明Scala 是强数据类型语言
3)在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变,val 修饰的变量不可改
4)val修饰的对象属性在编译后,等同于加上final
5) var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等)
6)变量声明时,必须有初始值(显示初始化)。
Scala数据类型
注:
1.Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
2.Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
3.AnyRef类是Scala里所有引用类(reference class)的基类
2、整型
数据类型 | 描述 |
---|---|
Byte [1] | 8位有符号补码整数。数值区间为 -128 到 127 |
Short [2] | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int [4] | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long [8] | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2的(64-1)次方-1 |
整型使用细节
1、Scala各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证Scala程序的可移植性。
2、Scala的整型 常量/字面量 默认为 Int 型,声明Long型 常量/字面量 须后加‘l’’或‘L’ 。
3、浮点类型
数据类型 | 描述 |
---|---|
Float | 32 位, IEEE 754标准的单精度浮点数 |
Double | 64 位 IEEE 754标准的双精度浮点数 |
浮点使用细节
1、与整数类型类似,Scala 浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。
2、Scala的浮点型常量默认为Double型,声明Float型常量,须后加‘f’或‘F’。
4、字符类型(Char)
字符类型可以表示单个字符,字符类型是Char, 16位无符号Unicode字符(2个字节), 区间值为 U+0000 到 U+FFFF。
1、字符常量是用单引号(‘ ’)括起来的单个字符。例如:var c1 = 'a‘ var c2 = '中‘ var c3 = '9'
2、Scala 也允许使用转义字符‘’来将其后的字符转变为特殊字符型常量。例如:var c3 = ‘ ’ // ' '表示换行符
3、可以直接给Char赋一个整数,然后输出时,会按照对应的unicode 字符输出 ['u0061' 97]
4、Char类型是可以进行运算的,相当于一个整数
5、布尔类型:Boolean
1、布尔类型也叫Boolean类型,Booolean类型数据只允许取值true和false。
2、boolean类型占1个字节。。
3、boolean 类型适于逻辑运算,一般用于程序流程控制。
6、Unit类型、Null类型和Nothing类型
数据类型 | 描述 |
---|---|
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null , Null 类型只有一个实例值 null |
Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)def f1():Nothing = { throw new Exception()} |
使用细节和注意事项
1、Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)。
2、Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义。
3、Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。
值类型转换
隐式转换
当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换 implicit conversion)。
自动类型转换细节说明:
1、有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
2、当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时,就会报错,反之就会进行自动类型转换。
3、(byte, short) 和 char之间不会相互自动转换。
4、byte,short,char 他们三者可以计算,在计算时首先转换为int类型。
5、自动提升原则: 表达式结果的类型自动提升为操作数中最大的类型。
高级隐式转换和隐式函数
scala还提供了非常强大的隐式转换机制(隐式函数,隐式类,隐式值,implicity等等)。
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
分支控制if-else
注意事项:
1、如果大括号{}内的逻辑代码只有一行,大括号可以省略
2、Scala中任意表达式都是有返回值的,也就意味着if else表达式其实是有返回结果的,具体返回结果的值取决于满足条件的代码体的最后一行内容.
3、Scala中是没有三元运算符,可以这样简写:val result = if (flg) 1 else 0
for循环控制
Scala 也为for 循环这一常见的控制结构提供了非常多的特性,这些for 循环的特性被称为for 推导式(for comprehension)或for 表达式(for expression)
①to:for(i <- 1 to 3){}
:前闭和闭,表示变量i从1遍历到3。
②until:for(i <- 1 until(3)){}}
:前闭和闭,表示变量i从1遍历到2。
③循环守卫:for(i <- 1 to 3 if i!=2){}
:循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为true则进入循环体内部,为false则跳过,类似于continue。
④引入变量:for(i <- 1 to 3; j = 4 - i) {}
,相当于for(i <- 1 to 3) { j = 4 - i}
,范围后一定要加;来隔断逻辑。
⑤嵌套循环:for(i <- 1 to 3; j <- 1 to 3) {}
,范围后一定要加;来隔断逻辑。
⑥循环返回值
val vector = for (i <- 1 to 3) yield i*i
println(vector)//Vector(1, 4, 9)
将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字。
⑦scala 的for循环的步长控制
for(i <- Range(1,3,2)){
println(i)//1
}
⑧使用循环守卫控制步长
for(i <- 1 until 7 if (i % 4 == 1) ) {
println(i)
}