《快学Scala(第二版)》-CH2 控制结构和函数
少年壮志不言愁
劝君惜取少年时
-
在Scala中
if/else
结构有返回值,这个值就是跟在if/else
之后的表达式的值scala> val x = 2 x: Int = 2 scala> val s = if(x > 1) 1 else -1 s: Int = 1
-
Scala中的表达式有类型,例如上面表达式
if/else
的类型是Int
,又比如if (x>0) "a" else -1
的类型是两个分支的公共超类型Any
如果没有else
,Scala中处理等同于if(x > 1) 1 else ()
,引入类Unit
Unit
类型只有一个值,写作()
-
Scala中,
{ }
块包含一系列表达式,结果也是一个表达式。块中最后一个表达式的值就是块的值。 -
输出使用
print/println
函数 -
readLine
从控制台读取一行输入,readInt
、readDouble
、readByte
、readShort
、readLong
、readFloat
、readBoolean
和readChar
读取数字、Boolean和字符 -
循环
-
for (i <- 表达式)
让变量i
遍历<-
右边的表达式的所有值 - Scala中,循环使用并不频繁,通常可用某个函数处理。
- Scala没有提供
break
或者continue
语句跳出循环,这里举例一下使用Breaks
对象中的break
方法跳出循环object BreakLoop { | def main(args: Array[String]) { | val a = 0 | val numList = List(1, 2, 3, 4, 5, 6) | val loop = new Breaks | loop.breakable { | for( a<- numList) { | println( "a is : " + a ) | if( a == 3 ){ | loop.break | } | } | } | println("Loop End") | } | }
-
-
高级for循环
- 用变量<-表达式的形式提供多个生成器,每个生成器可以带上if守卫
-
for推导式:如果for循环的循环体以
yield
开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值
-
定义函数:函数名、参数和函数体。Scala编译器可以通过
=
右侧的表达式的类型推断出函数返回类型 -
接收可变长度参数列表的函数
def sum(args:Int*)={ var result = 0; for(arg <- args) result += arg; result} val s = sum(1,2,3,4,6)
函数得到的是一个类型为Seq的参数,用for循环访问每一个元素。但如果已经有一个值的序列,则不能直接传入函数中,需要告诉编译器希望这个参数被当做参数序列处理,追加:_*.
val s = sum(1 to 5:_*) // 此处将1 to 5做参数序列处理
-
过程: 如果函数体包含在花括号中但没有前面的
=
号, 那么返回类型就是Unit
。这样的函数称为过程。过程不返回值 -
懒值: 当val被声明为lazy时,它的初始化将被推迟,直到首次对它取值。懒值对于开销较大的初始化语句有用,是介于val和def的中间状态,val在被定义时即被取值;lazy在被首次使用时取值;def在每一次被使用时取值。懒值并非没有额外开销,每次访问懒值时都会有一个方法被调用,这个方法会以线程安全的方式检查该值是否已被初始化
-
异常: Scala没有“受检”异常,不需要声明说函数或方法可能会抛出某种异常。控制器将在离抛出点最近的处理器中恢复,如果没有找到符合要求的异常处理器,则程序退出。