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>