2016-05-30 84 views
0

突围foreach循环的,我有这个下面的代码不能在斯卡拉

> .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{ 
>    code() 
>   break; 
>   } 

但不知道往哪里放it.Any理念????

+2

你可能想考虑**递归**,因为你正在使用Scala :-) – pietro909

+0

基本上我只是想跳出循环,因为scala donot已经中断或继续明确定义。在scala中找到新的位置需要帮助! ! :( – shab

回答

3

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

斯卡拉集合上的大多数方法,如foreach,都是为检查/修改整个集合而设计的。例外情况包括:contains,corresponds,exists,forall,indexWhere等。您会注意到大多数(所有?)处理布尔值,无论是作为参数(谓词函数)还是作为返回类型。

如果你的算法不能被重写来利用这些懒惰评估的方法之一,那么我建议遵循@ pietro909的建议,并重新设计它作为递归函数,在每次调用/递归时测试一个或多个退出条件。

我知道这是不是真的,你问什么,你可以在你的代码中插入breakable块实现你想要的这是真的,但如果你inspect the source你会看到符扔实施/捕捉异常,这是相当低效的,通常值得避免。

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

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

scala> val mybreaks = new Breaks 
mybreaks: scala.util.control.Breaks = [email protected] 

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块。