LazyMap на самом деле не ленивый?

Вот пример из книги по лестнице:

object Example1 {
  def lazyMap[T, U](coll: Iterable[T], f: T => U) = {
    new Iterable[U] {
      def iterator = coll.iterator.map(f)
    }
  }
  val v = lazyMap[Int, Int](Vector(1, 2, 3, 4), x => {
    println("Run!")
    x * 2
  })
}

Результат в консоли:

Run!
Run!
Run!
Run!
v: Iterable[Int] = (2, 4, 6, 8)

Как это ленивый?

1 ответ

Решение

Причина, по которой она вызывает функцию map, заключается в том, что вы работаете в консоли Scala, которая вызывает toString функция на ленивой карте. Если вы убедитесь, что не вернуть значение, добавив "" в конце вашего кода он не будет отображаться:

scala> def lazyMap[T, U](coll: Iterable[T], f: T => U) = {
        new Iterable[U] {
          def iterator = coll.iterator.map(f)
        }
      }
lazyMap: [T, U](coll: Iterable[T], f: T => U)Iterable[U]

scala> lazyMap[Int, Int](Vector(1, 2, 3, 4), x => {
        println("Run!")
        x * 2
      }); ""
res8: String = ""

scala>
Другие вопросы по тегам