一、控制循环
1、保存for循环的返回值:使用yield关键字;例如:
var x = for(i <- 0 to 10) yield i;
2 保存if的返回值,例如:
var x = for(true) 1000; else 0;
二、数据结构
1、Set集合
使用Set("1", "2")创建
使用"1" :: "2" :: Nil 创建
for(k<- set)println(key)遍历
set.foreach(e=>println(e))
set.foreach(println);
set foreach println
set forea
2、Map映射
使用Map("name"->"sun", "age"->"30")来创建
map("age")=31 更新
map("rank")="senior" 新增加
map += ("sex"->"male");新增
for((k,v)<-map) 遍历
map.foreach(e=>println(e._1))
map.foreach(println(_))
map foreach println
三、getter setter
def value = innerValue;
def value_(newValue) = {innerValue = newValue;}
四、apply和update
对于伴生对象调用(),会调用伴生对象的apply 例如Class()
对于伴生类调用(),会调用伴生类的apply方法,例如instance()
而对伴生类进行()赋值时会调用伴生类的update,例如:array(0) = 1; 之所以能用()其实是利用了update进行语法糖处理;
五、抽象类、继承和override
abstract class Car {
var name:String = "BMW";
def start(); //抽象方法
def message() = { println("message"); }
}
abstract class AUDICar extends Car {
override var name:String = "AUDI";
def start() = {} //覆盖ia抽象方法,不用使用override
override def message() = { println("AUDI");} //使用override关键字
}
六、特质trait
通过extends或者with来混入特质
例如Card extends trait1 with trait2
七、Option[T]
1、Option 就是一个可选值,要么就是Some[T],要么就是 None
也可以对Option[T]调用getOrElse,设定None的被选项
八、函数的类型和值
1、传统的函数定义方式:
def counter(v:Int) : Int = { v + 1}
2、该函数的类型如下 : (Int)=>Int , 当参数只有一个时,也即 Int=>Int
所有我们可以定义一个函数变量,例如 var a:Int=>Int; 表明a是一个函数类型, 函数的输入类型为Int ,函数返回类型为Int;
要注意是=>,而不是=,这是scala的语法要求。
3、函数的值
上面函数的值是 (v:Int)=>{v + 1} , 因为只有一条语句,也即(v:Int)=>v + 1;
所以我们可以完整的定义一个函数变量、并赋值,例如:
var a:Int=>Int = (v:Int)=>v+1; 这时要注意该写法与传统写法1的区别;
也可以 var a:Int=>Int={ (v:Int)=>{v + 1} };
由于scala有类型推断的能力,所以也可以写成
var a = (v:Int)=>v + 1;
九、匿名函数
var func:Int=>Int = (num:Int)=>num + 1;
func的类型是(Int)=>Int,参数只有一个时,可以省略()