Scala-4.控制结构-break和continue

2019-07-08 00:46:41 浏览数 (1)

Scala中没有break和continue这两个关键字,而是以scala.util.control.Breaks类的工具形式提供的。并且需要加上breakable方法来修饰语句块:

代码语言:javascript复制
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.")
}

以上代码的执行结果是:

代码语言:javascript复制
=== BREAM EXAMPLE ===
1
2
3
4
5

=== CONTINUE EXAMPLE ===
Found9p's in the string.

实际上执行到break方法时,一个异常被抛出,for循环结束。breakable方法会捕获异常,控制流继续执行被打断的代码块后面的其他代码。 continue方法类似,只是在捕获异常之后伴随下一个元素继续执行。

Scala中Continue的快捷用法

下面的代码和例子中的效果一样。

代码语言:javascript复制
val length = searchMe.count(_ == 'p') 
嵌套使用Break

可以通过标记break语句的方式创建多个嵌套的break:

代码语言:javascript复制
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,这时两个循环都退出。

0 人点赞