-
val 是不可变, var 是可变对象
-
trait 相当于 interface(多继承)和abstract(变量、方法实现)的结合体
3.模式匹配:更灵活的Switch case(1 匹配值的时候,值类型可以不一样。2 可以匹配类型)
4.类型
Unit 表示void
Noting 表示所有其他类型的子类型,表示没有值。不能有实例。用在类型推断推断不出来的时候,比如 val list=List()
Any 所有类型的超类,是Object的子类。可以理解为Scala里的Object
AnyRef 所有引用类型的超类
AnyVal 所有值类型的超类
Nil 表示长度为0的List
5.定义类
新建一个object(不是class,也不是trait),就相当于一个静态单例类,所有函数和变量都是静态的。
定义class的时候,可以直接传入参数,相当于构造函数。
重载构造函数时,直接用 def this,并且第一行必须调用默认this
类的属性默认是public,除非显示private
同一个文件的class和object同名,互为伴生,可以相互访问私有属性。
object可以有apply方法,使用时直接用object的名字即可。 -
流程控制语句
if else 和java一样
while、 do while 和java一样,没有i++只有i+=1
操作符方法 val a= 1 to 10,是 val = 1.to(10,1)的语法糖。
s“$i” 等同于 ""+i,字符串化
双重循环,可以用分号分割,写在一个for里面。 for里面还能写if,放在分号后面就行
配合yeild关键字,还能把for 里面的变量取出来组成一个集合
匿名函数 collect.foreach( e=>{print(e)}),有点像lambda。如果e只用一次,可以用_代替
7.方法\函数定义
返回值可以自动推断,但方法体内不能有return(必须省略)
如果只有一行,花括号可以省略
如果省略了方法名和方法体的等号,说明返回值为Unit
支持参数默认值
8.偏应用函数:某些情况下,方法的参数非常多,但是调用很频繁,只有少数参数变化,则可以定义偏应用函数,简化参数个数。
比如有一个函数 def fun(date:Date,log:String):Unit = print(s"$date $log")
然后date是不变的,但是要打印很多log,于是就会要 val date =new Date(); fun(date,"第一行");fun(date,"第二行").
为了每次不要都写两个参数,可以定义一个偏应用函数 def newfun = fun(date,_:String); 以后只需要 newFun("第一行"); newFun("第二行") 就可以了。