Это не имеет ничего общего с параллельными коллекциями. Проблема скрыта в литерале функции. Вы можете увидеть это, если разрешите компилятору показывать AST (с параметром -Xprint:typer
):
for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}
производит
scala.this.Predef.intWrapper(1).to(10).foreach[Unit](((x: Int) => {
java.this.lang.Thread.sleep(1000L);
scala.this.Predef.println(x)
}))
тогда
(1 to 10).foreach{Thread.sleep(1000);println(_)}
производит
scala.this.Predef.intWrapper(1).to(10).foreach[Unit]({
java.this.lang.Thread.sleep(1000L);
((x$1: Int) => scala.this.Predef.println(x$1))
})
Есть небольшая разница. Если вы хотите получить ожидаемый результат, вы должны изменить выражение foreach на
(1 to 10).foreach{x => Thread.sleep(1000);println(x)}
Но в чем разница? В вашем коде вы объявляете блок на foreach
, и после выполнения блока он возвращает функцию для выполнения. Затем эта возвращенная функция доставляется в foreach
, а не в блок, в котором она содержится.
Эта ошибка часто совершается. Это связано с литералом подчеркивания. Может быть этот вопрос вам поможет.