1.为什么要学习scala?
- spark底层时用scala实现的,想要学号spark,必须学会scala这门语言
- 语言有自己的特点,无论是在编程效率还是执行速度都要优于java
2.scala语言的介绍
-
scala时一门多范式的编程语言,及时面向对象也是函数式编程
-
函数式编程:所有的变量全部为一个对象,把函数当成编程
-
什么是多范式?
多范式:多种形式的编程,常见的有过程是式,函数式,泛型编程
面向对象:把数据和数据的操作方法放在一起,作为一个相互依存的整体
面向函数式编程:把函数可以当作变量使用,
函数式:scala的一等公民
一等公民的特权:
函数可以传递和赋值
scala中可以有嵌套函数和匿名函数
scala中还支持高阶函数
scala中还支持偏函数
scala支持闭包
3.scala语言和java语言的对比
相同点:
- java和scala可以无缝混编,他们都是基于jvm
- 二者可以相互调用
不同点:
- 类型自动推导
- val(常量)var(变量)
- 支持函数式编程
- 构造器不一样
- java中可以自动默认值,scala中必须手动给定默认值
- scala不需要分号,但是java必须要有
- get,set scala底层自动实现
age:相当于java 中的getter方法
age_$eq:相当于java中的set方法 - Java中的放回只能用return scala中没有return
4.编译工具的安装
- jdk
- idea
- 插件安装(离线和在线都可以)
scala-intellij-bin-2017.2.2.zip (一个插件就搞定了) - 创建一个scala项目测试
5.main方法讲解
main(static=object)
语法
关键字 方法名 (参数):放回只类型={
}
def main(args: Array[String]): Unit = {
}
6.常量和变量
- 定义
常量:是在运行过程中,其值不会发生变化的量,例如:数值3,字母A 修饰的关键字为val
变量:是在运行的过程中,其值可以发生变化的量,例如:时间,年龄 修饰的关键字时var - 语法
val name:Type=常量值
var name:Type=变量值
注意:类型可以不写,scala自动进行推导,变量名必须符合命名规范
7.scala中的数据类型有
- any是所有类型的超类,也成为顶级类型
- anyVal(值类型)
int, short, byte, long, double, string, char, boolean, Uint
长度4 2 1 8 8 4 2 1 - anyRef(引用类型):
List map option yourclass…
注意:java中没有和scala中nothing相对应的类型
8.懒加载
- scala中使用lazy关键字修饰变量,就是惰性变量,,实现延迟加载
注意:惰性变量只能是常量,并且只有在调用惰性变量时候,才会去实例化这个变量 - 示例演示
//正常的
var str = {
println(“helloworld”)
}
//懒加载的形式
lazy val str1 = {
println(“helloworld”)
}
//调用这个变量
str1 - 好处:使用在比较耗时的业务中,如网络IO 磁盘IO 场景:
9. 插值器,
scala中有三种插值器
1. s插值器:在任何字符串前面加上s,就可以直接在字符串中使用哪个变量了
demo:val name:String = "lostrever"
println(s"i love ${name}")
2. f插值器:
demo:val height = 1.234
println(f"身高是${height}%.2f")
3. raw插值器:是输入字符串原样,不进行转义,
demo:println(raw"\n\tss")
10. 访问修饰符
-
private :一个类的内部可用
-
protected :自己类,子类也可以被访问,(比java更加严格,java同一个包的其他类也可以访问)
-
public :如果没有指定修饰符,这样的成员在任何地方都能被访问
注意:不指定情况下是public
demo01:(只能自己访问)class Test01 { private val name = "曾经" def main(args: Array[String]): Unit = { println(name) } } demo02: class Test01 { protected val name = "沧海" } class Test02 extends Test01 { def main(args: Array[String]): Unit = { println(name) } } demo03: object Test { def main(args: Array[String]): Unit = { val test0 = new Test01 println(test0.name) } } class Test01 { val name = "难为水" }
11. 运算符
-
算术运算符
-
关系运算符
-
逻辑运算符
-
赋值运算符
算术运算符:加 减 乘 除 取余 object Test { def main(args: Array[String]) { val a = 100 val b = 200 val c = 250 val d = 250 println("a 加 b = " + (a + b)) println("a 减 b = " + (a - b)) println("a 乘 b = " + (a * b)) println("b 除 a = " + (b / a)) println("b 取余 a = " + (b % a)) } } 关系运算符: == != > < >= <= object Test { def main(args: Array[String]) { val a = 100 val b = 200 println("a 等于 b 是: " + (a == b)) println("a 不等于 b 是: " + (a != b)) println("a 大于 b 是: " + (a > b)) println("a 小于 b 是: " + (a < b)) println("b 大于等于 a 是: " + (b >= a)) println("b 小于等于 a 是: " + (b <= a)) } } 逻辑运算符:&& || ! object Test { def main(args: Array[String]) { var a = true; var b = false; println(a&&b) println(a||b) println(!a) } } 赋值运算符: = += -= *= /= %= var a = 10; val b = 20; var c = 0; c = a + b; println(c); var a = 10; var c = 0; c += a ; println( c ); var a = 10; var c = 0; c -= a ; println( c ); var a = 10; var c = 0; c *= a ; println("c *= a = " + c ); val a = 10; var c = 15; c /= a ; println("c /= a = " + c ); val a = 10; var c = 15; c %= a ; println("c %= a = " + c );
12.类型转换
- String 类型转换为Int
val age:String =“123”
println(age.toInt.getClass.getName) - Int 类型转换为String
val b:Int =123
println(b.toString.getClass.getName) - String类型转换为Float类型
val c:String =“123.123”
println(c.toFloat.getClass.getName)