2015-10-17 3 views
3

Вот пример из книги трапа: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) 

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

ответ

4

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

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> 
Смежные вопросы