函数式编程的一些基本概念

高阶函数:以其它函数作为参数或者以一个函数作为返回结果的函数。

函数嵌套:在函数中定义一个新的函数。

柯里化:方法可以定义多个参数列表,当使用较少参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接受剩余的参数列表作为其参数。

惰性求值/缓求值:物理上把机械能分成储蓄起来的势能和释放出来的动能。在版本 8 以前的 Java,以及它所 代表的许多语言里,集合的行为可以比作动能:各种操作都立即求得结果,不存在中间状 态。函数式语言里的 stream 则更像势能,它的操作可以引而不发。被 stream 储蓄起来的有数据来源,还有我们对数据设置的各种条件,如筛选操作。只有当程序员通过 forEach()、sum() 终结操作来向 stream“要”求值结果的时候,才触发从“势能”到“动能”的转换。在“动能”开始释放之前,stream 可以作为参数传递并后续附加更多的条件,继续积蓄它的“势能”。这里关于“势能”的比喻,用函数式编程的说法叫作缓求值(lazy evaluation)。

折叠/化约:foldLeft reduce,把集合分成一小块一小块处理。

闭包:英文closure 一种特殊函数,绑定函数内部引用的所有变量,就是把这个函数所引用的所有东西放在一个上下文里面包了起来。思维:让运行时去管理状态,比起自己硬着头皮去处理字段创建、呵护状态(包括经受多线程环境的严酷考验) 这些繁琐的事务,还不如交出对状态的控制权,让语言和框架悄悄在背后帮我们管理好。
命令式语言围绕状态来建立编程模型,参数传递是其典型特征。闭包作为一种对行为的建 模手段,让我们把代码和上下文同时封装在单一结构,也就是闭包本身里面,像传统数据 结构一样可以传递到其他位置,然后在恰当的时间和地点完成执行。