Из-за нестрогого характера итераторов следующее
List(1,2,3,4).iterator.map(_ => Future { slowFunction })
оценивается как Iterator[Future[Unit]]
, что является просто описанием преобразований, которые должны произойти, но еще не произошло. Ключ к пониманию:
Ленивые коллекции особенно полезны для описания последовательных операций преобразования без оценки промежуточных преобразований
Давайте немного переписаем ваш пример, чтобы подчеркните промежуточное преобразование
List(1,2,3,4)
.iterator
.map(_ => Future { slowFunction }) // <-- intermediate transformation
.foreach(x => Await.result(x, 10.seconds))
Таким образом, map(_ => Future { slowFunction })
является промежуточным преобразованием, которое не оценивается, однако это преобразование, которое должно было запустить фьючерсы. Вместо этого преобразование map
объединяется с преобразованием foreach
, которое выполняется как одно единственное преобразование, например
List(1,2,3,4)
.foreach(_ => Await.result(Future { slowFunction }, 10.seconds) )
Теперь становится ясно, что мы ожидаем завершения Future
, прежде чем двигаться к следующему элементу, следовательно, Future
s завершено последовательно.