Lazy vals in immutable case classes

Every additional val makes your object bigger, requiring more heap space, requiring more garbage collection.

I would suggest you program a large computation that takes a few minutes to run, and try it with val versus def versus lazy val.

Simple computations with no side effects (i.e. no locks) are ideal candidates to be inlined and then optimized over.