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>