一、条件表达式
在scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值。
scala> val x = 10 x: Int = 10 scala> val s = if (x>0) 1 else -1 s: Int = 1
在scala中每个表达式都有一个类型。举例来说,表达式if(x>0) 1 else -1的类型是Int,因为两个分支的类型都是Int.
混合表达式的类型是两个分支的类型的公共超类型。例如if(x>0) 1 else "aaa"的类型是Any(Any是Int和String类型的超类型)
如果else部分缺失了,那么if语句有可能没有值。例如if(x>0) 1
这种问题的解决方案是引入一个Unit类,写作().不带else的if语句就等同于 if (x>0) 1 else ()
二、函数式编程
在面向对象编程中,我们把对象传来传去,在函数式编程中,我们要做的是吧函数传来传去,而这个说成术语,我们把他叫做高阶函数。
在函数式编程中,函数是基本单位,是第一型,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。
三、scala数据类型
Byte Short Int Long Float Double Char String Boolean
Unit表示无值,和其他语言中void等同
Null空值或者空引用
Nothing所有其他类型的子类型,表示没有值
Any所有类型的超类,任何实例都属于Any类型
AnyRef所有引用类型的超类
scala拥有和java一样的数据类型,和java的数据类型的内存布局完全一致,精度也完全一致。
上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。
在scala中单行字符串和java中的表达方式完全一样,例如"hello world",另外scala中还有类似于python的多行字符串表示方式,用三个双引号表示分隔符
四、懒加载变量
scala方法的最后一行会被return
scala> val lazyVal = { println("i am too lazy"); 1}
i am too lazy
lazyVal: Int = 1
懒加载的情况:
scala> lazy val lazyVal = { println("i am too lazy"); 1}
lazyVal: Int = <lazy>
scala> val x = lazyVal
i am too lazy
x: Int = 1
五、总结
六、Null,None,Nil,Nothing
Null:Trait,其唯一实例为null,是AnyRef的子类,不是AnyVal的子类
Nothing:Trait,所有类型(包括AnyRef和AnyVal)的子类,没有实例
None:Option的两个子类之一,另一个是Some,用于安全的函数返回值
unit:五返回值的函数的类型,和java的void对应
Nil:长度为0的list