Scala中没有break和continue这两个关键字,而是以scala.util.control.Breaks类的工具形式提供的。并且需要加上breakable方法来修饰语句块:
import util.control.Breaks._
object BreakAndContinueDemo extends App {
println("\n=== BREAM EXAMPLE ===")
breakable {
for (i <- 1 to 10) {
println(i)
if (i > 4) break
}
}
println("\n=== CONTINUE EXAMPLE ===")
val searchMe = "peter piper picked a peck of pickled peppers"
var numPs = 0
for (i <- 0 until searchMe.length) {
breakable {
if (searchMe.charAt(i) != 'p') {
break
} else {
numPs += 1
}
}
}
println("Found" + numPs + "p's in the string.")
}
以上代码的执行结果是:
=== BREAM EXAMPLE ===
1
2
3
4
5
=== CONTINUE EXAMPLE ===
Found9p's in the string.
实际上执行到break方法时,一个异常被抛出,for循环结束。breakable方法会捕获异常,控制流继续执行被打断的代码块后面的其他代码。 continue方法类似,只是在捕获异常之后伴随下一个元素继续执行。
下面的代码和例子中的效果一样。
val length = searchMe.count(_ == 'p')
可以通过标记break语句的方式创建多个嵌套的break:
object LabeledBreakDemo extends App {
import scala.util.control._
val Inner = new Breaks
val Outer = new Breaks
Outer.breakable {
for (i <- 1 to 5) {
Inner.breakable({
for (j <- 'a' to 'e') {
if (i == 1 && j == 'c') Inner.break() else println(s"i: $i, j: $j")
if (i == 2 && j == 'b') Outer.break()
}
})
}
}
如果第一个if条件被满足,抛出的异常会被Inner.breakable捕获,外层的继续,如果第二个if条件被处罚,控制流交给Outer.breakable,这时两个循环都退出。