分支控制
if-else
- 单分支:
if{}
- 双分支:
if{} else{}
- 多分支:
if{} else if{}
- Scala 中的
if-else
是有返回值的, 具体取决于满足条件的代码块的最后一行内容
- Scala 中是没有三元运算符的, 但是可以用
if-else
代替
switch
Scala 中是没有switch
的, 而是使用模式匹配来处理的
循环控制
for
Scala 中为for
提供了很多的特性:
1. 范围数据循环 (to
)
1
2
3
4
|
// 前后闭合: [1,3]
for (i <- 1 to 3) {
println(i)
}
|
2. 范围数据循环 (until
)
1
2
3
4
|
// 前闭后开: [1, 3)
for (i <- 1 until 3) {
println(i)
}
|
3. 循环守卫
1
2
3
4
5
6
7
8
9
10
|
for (i <- 1 to 3 if i != 2) {
println(i)
}
// 上面的代码就相当于:
for (i <- 1 to 3) {
if (i != 2) {
println(i)
}
}
|
4. 循环步长
1
2
3
|
for (i <- 1 to 10 by 2) {
println(i)
}
|
5. 嵌套循环
1
2
3
4
5
6
7
8
9
10
11
|
// 因为没有关键字, 所以一定要加 `;` 来进行分割
for (i <- 1 to 3; j <- 1 to 3) {
println("i=" + i + ", j=" + j)
}
// 上面的代码相当于:
for (i <- 1 to 3) {
for (j <- 1 to 3) {
println("i=" + i + ", j=" + j)
}
}
|
6. 引入变量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
for (i <- 1 to 3; j = 4 - i) {
println("i=" + i + ", j=" + j)
}
// for 推导式有一个不成文的规定:
// 1. 仅包含单一表达式时, 使用圆括号
// 2. 当包含多个表达式时, 一般每一行一个表达式, 并且用花括号
for {
i <- 1 to 3
j = 4 - i
} {
println("i=" + i + ", j=" + j)
}
|
7. 循环返回值
1
2
3
|
val res = for (i <- 1 to 5) yield { i * 2 }
// 输出 2, 4, 6, 8, 10
println(res)
|
8. 倒序
1
2
3
|
for (i <- 1 to 10 reverse) {
println(i)
}
|
while
和do..while
Scala 中的while
和do..while
和 Java 中的用法一致
while
- 循环条件是返回一个布尔值的表达式
while
先判断再执行
- 与
for
不同, while
没有返回值, 即整个while
语句的结果是Unit
类型
do..while
- 循环条件是返回一个布尔值的表达式
do..while
先执行再判断
循环中断
Scala 内置控制结构特地去掉了break
和continue
. 是因为更好的适应函数式编程, 推荐使用函数式的风格解决break
和continue
, 而不是一个关键字. Scala 中使用breakable
控制结构来实现break
和continue
功能.
异常的方式退出
1
2
3
4
5
6
7
8
9
10
11
|
def main(args: Array[String]): Unit = {
try {
for (elem <- 1 to 10) {
println(elem)
if (elem == 5) throw new RuntimeException
}
} catch {
case e =>
}
println("结束循环")
}
|
Scala 自带函数退出
1
2
3
4
5
6
7
8
9
10
11
12
|
import scala.util.control.Breaks
def main(args: Array[String]): Unit = {
Breaks.breakable(
for (ele <- 1 to 10) {
println(ele)
if (ele == 5) Breaks.break()
}
)
println("结束循环")
}
|
对break
进行省略
1
2
3
4
5
6
7
8
9
10
11
12
|
import scala.util.control.Breaks._
def main(args: Array[String]): Unit = {
breakable(
for (ele <- 1 to 10) {
println(ele)
if (ele == 5) break
}
)
println("结束循环")
}
|
continue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import scala.util.control.Breaks._
def main(args: Array[String]): Unit = {
for (ele <- 1 to 10) {
breakable(
if (ele % 2 == 1)
break
else
println(ele)
)
}
println("结束循环")
}
|
这里的breakable
和上面的区别是将其放入到了循环内部, 这样可以实现结束本次执行而不是整个循环结束, 从而实现continue
的功能.