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