lazyMap其实不懒惰?
lazyMap is actually not lazy?
这是阶梯书中的一个例子:
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)
怎么这么懒?
它调用 map 函数的原因是因为您在 Scala 控制台中 运行 调用了 lazyMap 上的 toString
函数。如果您通过在代码末尾添加 ""
来确保不 return 该值,则它不会映射:
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>
这是阶梯书中的一个例子:
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)
怎么这么懒?
它调用 map 函数的原因是因为您在 Scala 控制台中 运行 调用了 lazyMap 上的 toString
函数。如果您通过在代码末尾添加 ""
来确保不 return 该值,则它不会映射:
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>