с использованием for...yield
- это просто альтернативный синтаксис для вызова карты. Мы можем увидеть, как компилятор отлаживает для понимания, скомпилировав ваш код с флагом -Xprint:parse
компилятора.
val lst = List("abc", "def", "ghi", "jkl");
val indexes = List(1, 2, 3);
val val_1 = indexes.withFilter(((check$ifrefutable$1) => check$ifrefutable$1: @scala.unchecked match {
case (index @ (_: Int)) => true
case _ => false
})).map(((index: Int) => lst(index)));
val val_2 = indexes.map(((index) => lst(index)));
Как видите, код for
, который вы использовали для val_1, в итоге становится вызовом .map(((index: Int) => lst(index)))
, как и код для val_2.
Часть withFilter вызвана тем, что index:Int <- indexes
вызывает сопоставление с шаблоном, так как здесь вы объявляете, что индекс должен быть Int. Если мы удалим аннотацию типа, чтобы строка была просто val val_1 = for (index <- indexes) yield lst(index)
, и перекомпилировали, вы получите следующий вывод:
val lst = List("abc", "def", "ghi", "jkl");
val indexes = List(1, 2, 3);
val val_1 = indexes.map(((index) => lst(index)));
val val_2 = indexes.map(((index) => lst(index)));
Теперь очевидно, что и 1015 *, и явный map
идентичны после компиляции.