2016-05-30 88 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塊。