无法在scala中突破foreach循环

时间:2016-05-30 07:41:54

标签: scala loops foreach scala-collections

我有以下代码

> .foreach("${plist}", "newshole") {
>        exec(
>          http("get the user id")
>            .get("${newshole}/jcr:content.1.json")
>            .headers(headers_2)
>            .check(bodyString.saveAs("Res1"))
>        )
>        exec(session => {
>          var mynewshole = session("Res1").as[String]
>          if (!mynewshole.contains("testingInProgress")) {
>            println("Doesn't contain: " + mynewshole)
>            (http("post the user id")
>              .post("${newshole}/jcr:content")
>              .headers(headers_2)
>              .formParam("testingInProgress", session.userId))
>            exec(http("Create print package")
>              .post("/bin/cqtg-create-print-package.do")
>              .headers(headers_2)
>              .formParam("newsholeId", "${plist}")
>              .formParam("digitalMasterId", "1adpy8")
>              .check(status.is(200)))
> 
>          }
>          session
>        })   
>      }

我想突破:

> if (!mynewshole.contains("testingInProgress")) {
>            println("Doesn't contain: " + mynewshole)
>            (http("post the user id")
>              .post("${newshole}/jcr:content")
>              .headers(headers_2)
>              .formParam("testingInProgress", session.userId))
>            exec(http("Create print package")
>              .post("/bin/cqtg-create-print-package.do")
>              .headers(headers_2)
>              .formParam("newsholeId", "${plist}")
>              .formParam("digitalMasterId", "1adpy8")
>              .check(status.is(200)))
> 
>          }
>          session

基本上我想在我的第一个条件遇到时从循环中突然出来。所以我想按照scala教程使用下面的代码,但是不知道在哪里放置breakable命令,因为它给了我错误。

> breakable{
>             code ()
>          break;
>            }

但不知道放在哪里。任何想法????

1 个答案:

答案 0 :(得分:3)

Scala并不真正提供任何易于使用的break / continue控制流原语。这不是功能性的做事方式。

Scala集合中可用的大多数方法(如foreach)旨在检查/修改整个集合。例外情况包括:containscorrespondsexistsforallindexWhere等。您会注意到大多数(全部?)都与布尔人打交道,要么作为参数(谓词函数)要​​么作为返回类型。

如果您的算法无法重新使用其中一种惰性评估方法,那么我建议遵循@ pietro909的建议并将其重新设计为递归函数,该函数在每次调用/递归时测试一个或多个退出条件。

我知道这不是你要求的,而且你可以通过在代码中插入breakable块来实现你想要的,但如果你inspect the source你会看到中断是通过抛出/捕获异常来实现的,这非常低效并且通常值得避免。

但如果你决心走这条路,这应该提供一些指导:

scala> import util.control.Breaks
import util.control.Breaks

scala> val mybreaks = new Breaks
mybreaks: scala.util.control.Breaks = scala.util.control.Breaks@69ea3742

scala> import mybreaks.{break, breakable}
import mybreaks.{break, breakable}

scala> breakable {
     | (1 to 34).foreach(x => if (x > 9) break else println(x))
     | println("all done")
     | }
1
2
3
4
5
6
7
8
9

注意:break不仅会终止foreach()语句,而且会突破整个breakable块。