Не удается разорвать цикл 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, поскольку она дает мне ошибки.

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

но не знаю, где его поставить. Любая идея????

1 ответ

Scala на самом деле не предлагает простой в использовании break/continue примитивы потока управления. Это не функциональный способ делать вещи.

Большинство методов, доступных в коллекциях Scala, например, foreach, предназначены для проверки / изменения всей коллекции. Исключения включают в себя: contains, corresponds, exists, forall, indexWhereи т. д. Вы заметите, что большинство (все?) имеют дело с логическими значениями, либо как аргумент (функция предиката), либо как тип возвращаемого значения.

Если ваш алгоритм не может быть переработан так, чтобы использовать один из этих лениво оцененных методов, я бы порекомендовал следовать совету @pietro909 и переделать его в рекурсивную функцию, которая проверяет одно или несколько условий выхода при каждом вызове / рекурсии.

Я знаю, что это не то, что вы просили, и это правда, что вы можете достичь того, что вы хотите, вставив breakable блокировать в своем коде, но если вы изучите источник, вы увидите, что разрывы реализуются путем генерирования / перехвата исключений, что довольно неэффективно и обычно стоит избегать.

Но если вы полны решимости пойти по этому пути, это должно дать некоторые рекомендации:

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 блок.

Другие вопросы по тегам