文章目录
Scala 內建控制结构
需要注意的是,大多数的 Scala 控制结构,都会返回一个结果值。也就是说,大多数的控制结构都是表达式级别的存在
IF 表达式
这个是最基础的控制结构
WHILE 循环
while 循环 或者 do-while 循环,它们只能称之为循环(loop),因为它们不能返回一个有意义的值,它们只能返回
Unit
Scala 中的赋值语句,总是返回Unit
,有些在 java 中的惯用法,在 Scala 中使用需要小心
var line = ""
while ((line = readLine()) != "") {
// ...
}
// line = readLine() 的结果是 Unit,所以 while 中的条件表达式永远为 true
FOR 表达式
For 表达式,在 Scala 中被称为迭代器的瑞士军刀。通过简单的组合来表达丰富的迭代
遍历集合
通过 for 表达式,能够遍历集合、数组以及任何实现了Traversable特质的类
var files = new File(".").listFiles()
for (file <- files) println(file.getName)
过滤
如果你不想遍历一个集合的整体,而是想要过滤出它的部分子集,你可以为这个 for 表达式加上一个
filter
for (file <- files if file.getName.endsWith(".scala")) println(file)
上述的 for 只是应用了它的副作用(side-effects),返回的结果为 Unit
如果一个 for 表达式能够被称之为表达式(expression),是因为它可以产出一个特定的结果
内嵌迭代
使用多个
<- Clauses
,就可以获得内嵌迭代
中流(Mid-Stream)变量绑定
对于 for 表达式中可能会进行多次的变量运算,可以抽取出来,形成中流变量,从而避免部分的性能开销
产出(yield)新的集合
for clause yield body
yield
关键字要放置在 body 之前,即便 body 是用花括号(curly)括起来,也要放在左花括号之前
异常处理以及 Try 表达式
和其他语言不同的地方是,Scala 的异常含有一个返回结果类型:
Nothing
catch clauses 可以使用模式匹配(pattern matching)
Scala 不需要你必须 catch 那些 checked exception 或者声明它们在一个 throws clause 当中
finally clause 中的计算值会被丢弃掉。通常 finally clause 执行的是某种意义上的清洗(clean up),而不应该改变主体中的计算值
匹配表达式(Matching expression)
匹配表达式是 Scala 中的一个强大的功能,它比 Java 中的 swtich 受限较少,可以匹配任何类型,使用语法如下:
不会出现穿透情况(fall-through)的发生,使得代码更加的安全可靠
val foo = "xx"
val bar = foo match {
case "xx" => "I am foo"
case _ => "huh?"
}
println(bar)
在模式匹配中,对于常量,Scala 默认认为首字母为大写的变量为常量
没有 Break & Continue
因为 Scala 更加倾向于函数式的编程设计,所以取消了 Break & Continue
如果你就是想要使用,那么可以参考如下示例:
import scala.util.control.Breaks._
import java.io._
val in = new BufferedReader(new InputStreamReader(System.in))
breakable {
while (true) {
println("? ")
if (in.readLine() == "") break
}
}
变量的作用域(Scope)
Scala 的变量作用域和 Java 大体是一致的,但是有一点不同,那就是在内嵌(nested)的作用域中,可以命名同样的变量,叫做外部的影子(shadow)变量
建议
通常在内嵌的作用域中使用新的、有意义的名称来命名变量,而不是使用外部的影子变量