scala基础语法
类型图
Actor模型
1. 进程之间通信的方式有三种
* 管道
* 文件,linux系统
* 信号量,中断信号等
2. actor可以理解为无锁并发模型,和golang中的一模一样
3. 并发模型:不要用共享内存的方式去通信,要用通信的方式共享内存。actor可以类比于golang中的channel
六大特性
1. 与java无缝整合
2. 类型推断
3. 支持分布式和并发Actor
4. Trait特质特性
5. 模式匹配Match
6. 高阶函数
类和对象
1. 当new类时,类中除了方法不执行其它都执行
2. object相当于java中的单例,定义都是静态的,可以传参默认调用apply方法
3. class可以传参,传参就有默认的构造
4. 重写构造时,第一行要先调用默认的构造
5. for(1 to 10)(1 until 10] (i <- 1 to 10) (i <- 1 to 10;j <- 1 to 10;)
6. whil... do.. while i += 1
7. if... else...
方法和函数
1. 方法定义
* def定义方法
* 方法中传参要指定类型
* 方法自己可以推断返回值,默认将方法体中最后一行的的计算结果当作返回值返回
* 如果要写return,要显示的声明方法体的返回值
* 如果方法体只有一行,那么可以将方法体的花括号去掉
* 如果方法名称和方法体之间没有“=”则无论最后一行返回什么都会被丢弃,实际上返回值会被默认为Unit,这时需要显示的声明返回值
2. 递归方法
3. 参数有默认值的方法
4. 参数有可变长的方法 def fun(x: String*)
5. 匿名函数
* ()=>{...}
* 可以赋值给一个变量,这个变量使用的函数就是匿名函数
6. 偏应用函数 val x = x(_:String,2:Int)
7. 嵌套方法
8. 高阶函数
* 函数的参数是函数
* 函数的返回是函数
* 函数的参数和返回都是函数
9. 柯里化函数 高阶函数的简化 def x(i:Int)(j:Int)
字符串、集合
1. String 就是java中的string
2. 集合
* Array
* ArrayBuffer
* List val x = List(1,2,3,4)
* ListBuffer
* Set 默认不可变,可变需要导入scala.collection.mutable.Set
* Map 默认不可变,可变需要导入scala.collection.mutable.Map
* Tuple 元组 最多支持22个元素
Trait
1. 相当于java中的接口和抽象类的结合
2. 可以在Trait中定义抽象和非抽象方法
3. Trait不可以传递参数
4. 类继承Trait第一个关键字使用extends,之后使用with
Match
1. match ... case.. 模式匹配中既可以匹配值,也可以匹配类型
* case 123 => {}
* case i:String => {}
2. 模式匹配中,从上往下匹配,匹配上了自动停止
3. 模式匹配过程中会存在值的转换
4. case _=> {} 类似于java的default,需要写在最有一行
5. 模式匹配 match... case ... 相当于一行
样例类
1. case class xxx
* 样例类可以new,也可以不new
* 样例类中参数默认会实现getter和setter方法,对外是可见的
偏函数
1. def xx: PartialFunction[+A,-B]
* +A 指的是匹配的类型
* -B 指的是匹配的结果
* 相当于java中的switch... case...
隐式转换
1. 隐式值与隐式函数
* 隐式值指在定义参数时前面加上implicit。隐式参数是指在定义方法时,方法中的部分参数是由implicit修饰,如果方法中有隐式参数和非隐式参数,则必须使用柯里化的方式,将隐式参数写在后面的括号中。隐式转换的作用就是:当调用方法时,不必手动传入方法中的隐式参数,scala会自动在作用域范围内寻找隐式值自动传入。
* 同类型的参数的隐式值只能在作用域内出现一次,同一个作用域内不能定义多个类型一样的隐式值。
* implicit 关键字必须放在隐式参数定义的开头
2. 隐式转换函数
* 隐式转换函数是用关键字implicit修饰的方法。当scala运行时,假设如果A类型变量调用了method()这个方法,发现A类型的变量没有method()方法,而B类型有此method()方法,会在作用域内寻找有没有隐式转换函数将A类型转换为B类型,如果有那么A就可以调用method()这个方法
* 隐式转换函数注意:隐式转换函数只与函数的参数类型和返回类型有关,与函数名称无关,所以作用域内不能有相同的参数类型和返回类型的不同名称隐式转换函数。
3. 隐式类
* 使用implicit关键字修饰的类就是隐式类。若一个变量A没有某些方法或者某些变量时,而这个变量A可以调用某些方法或者某些变量时,可以定义一个隐式类,隐式类中定义这些方法或者变量,隐式类中传入A即可。
* 隐式类必须定义在类,包对象,伴生对象中。
* 隐式类的构造必须只有一个参数,同一个类,包对象,伴生对象中不能出现同类型构造的隐式类。
_的用法集合
1. 导包 import scala.collection.mutable._
2. 指代当前迭代对象 map(_.name)
3. 占位符 case _
4. 方法转换为函数 def x(i:String):Unit = {....} val fun = x _
5. array转成多参数传入 x: _*