morfizm (morfizm) wrote,
morfizm
morfizm

Scala

Что напечатает следующяя программа?
def main(argv: Array[String]): Unit = {
  range = Future.successful(1 to 5)
  for (a <- range) { System.out.println(s"a$a") }
  for (b <- range) { System.out.println(s"b$b") }
}
Вы думаете a1 a2 a3 a4 a5 b1 b2 b3 b4 b5?
Я тоже так думал.
На самом деле, он может:
1. Произвольным образом перемежать последовательности a... и b...
2. Бросить любую из последовательностей в любом месте.

Потому что скаловский for это, на самом деле, f-king flatMap, который для Future означает, что тело for'а будет создаваться тоже во Future. Этот Future начнёт исполняться на тредпуле, параллельно коду, который следует за for. Возможно, на таком тривиальном примере вы никогда не увидите этого эффекта, но я сегодня полдня это дебаггал :) Тот факт, что range это уже завершённый Future, влияет только на то, что тела циклов начнут исполняться немедленно, но всё равно на тредпуле.
Tags: 1, fun, software development, work
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment