List集合
- list是一个有序且可以重复的序列。
- 创建list集合
List(elem1, elem2...)
这些元素可以不是同一类型 -
list组成结构
list.head 返回list集合中的第一个元素
list.tail 返回除了list.head以外的所有元素(也是个list集合);如果原list只有一个元素,则返回Nil(这是一个类,专门用来表示空的list集合)。
-
list添加元素(:: 操作符只适用于list集合)
-
创建可变的list集合(可以使用+=、++=、-=、--=运算符),并添加元素。注意:可变与不可变可以相互转换
- Set集合和List一样,分可变和不可变Set集合。但是set集合中的元素是无序且没有重复的。
集合元素映射
-
yield关键字会把当前结果记下来,保存在一个新的集合中,循环结束后,返回新的集合(原来是什么类型的集合就返回什么类型)
-
filter和map函数
_符号用来表示每个元素
filter函数对不满足表达式的进行过滤
map函数对每个元素进行操作后返回新的值
Scala面向对象特性
- 半生类和半生对象
- 可以互相访问私有属性
-
同名且在同一scala文件中
-
半生对象中的apply方法可以实现,构造对象的时候不使用new关键字
- 主构造方法
- 主构造方法的参数直接跟在类名后面
- 主构造方法的函数体就是类中除了其余方法的所有代码,会在new一个对象的时候执行
-
如果参数不声明val或者var,则相当于private[this],只能在内部使用
- 字段的访问性
- var name = “” 在编译的时候会把这个字段变为私有的,但是会对外提供get和set方法,这样就可以不用自己定义get和set方法
- private var name = “” 生成的get和set方法不会对外
- val 定义的只有get方法
- private[this] 定义的只能在对象中使用。
- def name = {} 可以自定义get;def name_=(){} 可以自定义set方法(注意_两边不能有空格)
高阶函数
-
函数作为参数传递
-
函数作为返回值
scala中的模式匹配
scala中没有提供switch case语法,相应的是: 变量 match{case 值 => 代码}语法。它的特点在于:可以匹配任何情况,包括匹配值、类型、集合的元素等。
匹配集合的元素,匹配List集合时,需要使用::操作符
scala隐式转换
可以自定义隐式函数,即implictit function。定义的隐式转换函数,会被scala在需要转换的情况自动使用。因为编译器需要对隐式函数进行导入,因此通常使用"one2one"的命名方式。
Older类型转化为SpecialPerson类型
scala中的trait类
- 类可以使用extends关键字,但是在scala中没有implement,但trait类可以作为接口来使用。统一使用extends
- 继承trait类后,必须实现其中的抽象方法。
- 使用extends ··· with ···实现多重继承trait类
- trait类可以定义抽象方法、具体方法(会被继承)、抽象字段、具体字段(会被继承)。
-
多个trait类有相同的方法,则从继承的顺序最左边,然后往右依次执行
scala中的多线程
两个线程之间通信示例
import scala.actors.Actor
/**
* Created by wulei on 2016/12/27 0027.
*/
object Student {
// 让这个类支持模式匹配
case class Message(content: String, sender: Actor)
// 多线程必须继承Actor类
class LeoActor extends Actor {
// 类型java中的run方法,需要重写
def act() {
while (true) {
// 接受消息
receive {
case Message(content, sender) => {
// 打印接受的消息
println("leo: " + content)
// 向这个线程发送消息(这里是字符串)
sender ! "please call me after 10 minutes."
}
}
}
}
}
class JackActor(val LeoActor: Actor) extends Actor {
def act() {
// 向一个线程发送消息(这里是一个对象)
LeoActor ! Message("Hello , leo, I'm Jack. Are you free Now?", this)
while (true) {
// 接收消息
receive {
case resphone: String => println("Jack: " + resphone)
}
}
}
}
def main(args: Array[String]): Unit = {
val leo = new LeoActor()
val jack = new JackActor(leo)
leo.start() //启动线程
jack.start()
}
}