Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations。
1.惰性 Vs. 饥饿
求值策略决定函数的实参应该在何时被求值,以及实参以什么方式传递到函数体内。虽然看起来求值策略仅仅涉及到函数调用,其实表达式的操作符,条件表达式的?都可以归结为一个函数调用。函数的实参求值时机分两种:
- 饥饿求值(Strict/Eager Evaluation),应用序 (Applicative order,实用序)求值。简单地说,函数调用时先计算所有实参的值。在方法被调用前,所有的实参通通被求值,即使方法中不使用某些实参也被求值。实参的值计算之后,以什么方式传递到函数体内是应用序要考虑到第二个问题。在C/C++教学中一般会介绍按值传递(pass-by-value,或Call-by-value)和按引用传递(pass-by-reference)。
- 延迟计算/惰性求值 (delay computing /Lazy Evaluation),又被称为normal-order evaluation(正常序求值),其求值顺序按“最左最外/leftmost outermost”方式求值。如果采用这种方式,其过程“完全展开而后归约”(''fully expand and then reduce