Summary
Lazy evaluation delays the evaluation of an expression till the value of expression is needed. Delaying the expression evaluation speeds up the program in many cases, and optimizes the memory utilization.
Memoized functions speed up in their subsequent calls as their output value in the first call is memoized.
Streams are lazy list. An element of a stream is evaluated on-demand and value is memoized. In subsequent calls on stream object for same element, it returns memoized value..