¿Scala mapValues es vago?

Cuando llamo

System.err.println("Before")
System.err.flush()
val foo: Map[Int, T] = t mapValues (fn(_))
System.err.println(foo.head) //prevent optimiser from delaying the construction of 'foo' 
System.err.println("After")
System.err.flush()

confn teniendo una declaración de impresión de depuración dentro, obtengo esta salida:

Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...

No entiendo por qué se llaman las declaraciones de impresión de depuración después de que se imprime "Después", y no entiendo por qué lo recibo dos veces --- a menos quemapValues crea un mapa perezoso?

Respuestas a la pregunta(2)

Su respuesta a la pregunta