Какая польза от выхода в Scala над картой? - PullRequest
0 голосов
/ 17 мая 2018

В приведенном ниже коде val_1 & val_2 возвращают одинаковые значения.

val lst = List("abc","def","ghi", "jkl")
val indexes = List(1,2,3)
val val_1 = for (index:Int <- indexes) yield lst(index)
val val_2 = indexes.map(index => lst(index))

выход

val_1: List[String] = List(def, ghi, jkl)
val_2: List[String] = List(def, ghi, jkl)

если map может делать то, что нам нужно, зачем нужен yield? Есть ли другие варианты использования yield ?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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

0 голосов
/ 17 мая 2018
for (index:Int <- indexes) yield lst(index)

Это для понимания . Этот конкретный пример является самой простой формой использования этого. И это эквивалентно List.map.

Согласно FAQ / доходность

Скала «для понимания» эквивалентна нотации Хаскелла «до», и это не более чем синтаксический сахар для составления нескольких монадических операций.

Это другое?

Scala «для понимания» - это синтаксический сахар для составления множества операций с foreach, map, flatMap, filter или withFilter

Почему?

Когда вы смотрите на очень простые для понимания, альтернативы map / foreach выглядят действительно лучше. Однако, как только вы начнете их составлять, вы можете легко потеряться в скобках и уровнях вложенности. Когда это происходит, для понимания обычно гораздо яснее.

...