《java 8 实战》读书笔记 -第十四章 函数式编程的技巧

斑点喵 2019-11-17

一、无处不在的函数

一等函数:能够像普通变量一样使用的函数称为一等函数(first-class function)
通过::操作符,你可以创建一个方法引用,像使用函数值一样使用方法,也能使用Lambda表达式(比如,(int x) -> x + 1)直接表示方法的值。

Function<String, Integer> strToInt = Integer::parseInt;

1.高阶函数

能满足下面任一要求就可以被称为高阶函数(higher-order function):

  • 接受至少一个函数作为参数
  • 返回的结果是一个函数

Java 8中,函数不仅可以作为参数传递,还可以作为结果返回,能赋值给本地变量,也可以插入到某个数据结构。比如,一个计算口袋的程序可能有这样的一个Map<String, Function<Double, Double>>。

用不同的方式实现类型定义,如下所示:

Function<Function<Double,Double>, Function<Double,Double>>

我们把它定义成Function类型(最左边的Function),目的是想显式地向你确认可以将这个函数传递给另一个函数。但是,最好使用差异化的类型定义,函数签名如下:

Function<Double,Double> differentiate(Function<Double,Double> func)

其实二者说的是同一件事。

2.科里化

科里化的理论定义
科里化是一种将具备2个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并且这个函数的返回值也是一个函数,它会作为新函数的一个参数。后者的返回值和初始函数的返回值相同,即
f(x,y) = (g(x))(y)
ps:通俗点,就是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回(接受余下参数而且返回结果的)新函数的技术

当然,我们可以由此推出:你可以将一个使用了6个参数的函数科里化成一个接受第2、4、6号参数,并返回一个接受5号参数的函数,这个函数又返回一个接受剩下的第1号和第3号参数的函数。一个函数使用所有参数仅有部分被传递时,通常我们说这个函数是部分应用的(partially applied)。

二、持久化数据结构

应该注意的第一件事是,函数式方法不允许修改任何全局数据结构或者任何作为参数传入的参数。

1.破坏式更新和函数式更新的比较

《java 8 实战》读书笔记 -第十四章 函数式编程的技巧

三、Stream 的延迟计算

Java 8的设计者们在将Stream引入时采取了比较特殊的方式。其中一个比较显著的局限是,你无法声明一个递归的Stream,因为Stream仅能使用一次。
主要是利用Supplier,其他略。

四、匹配模式

Java 8语言中暂时并未提供这一特性,略。

相关推荐

86447318 / 0评论 2019-10-23