读Java实战(第二版)笔记10_函数式编程的技巧

1.设计原则

1.1.将所有你愿意接受的作为参数的函数可能带来的副作用以文档的方式记录下来

1.2.最理想的情况下你接收的函数参数应该没有任何副作用

1.3.延迟数据结构是强力武器

1.4.所有使用持久化数据结构的用户都必须遵守“不修改”原则

2.一等函数

2.1.first-class function

2.2.能够像普通变量一样使用的函数

2.2.1.可以作为参数传递

2.2.2.可以作为结果返回

2.2.3.能存储在数据结构中的函数

2.3.::操作符

2.3.1.创建一个方法引用,像使用函数值一样使用方法

2.4.Lambda表达式

2.4.1.直接表示方法的值

3.高阶函数

3.1.higher-order function

3.2.接受至少一个函数作为参数

3.3.返回的结果是一个函数

3.4.满足任一要求

3.4.1.comparing

3.4.2.andThen

3.4.3.compose

4.柯里化

4.1.帮助你模块化函数和重用代码的技术

4.2.将具备两个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并且这个函数的返回值也是一个函数,它会作为新函数的一个参数

4.3.后者的返回值和初始函数的返回值相同,即f(x, y) = (g(x))(y)

5.部分求值

5.1.partially applied

5.2.当一个函数使用的所有参数仅有部分(少于函数的完整参数列表)被传递时

6.持久化数据结构

6.1.数据结构的值始终保持一致,不受其他部分变化的影响

6.2.final只能应用于类的字段,无法应用于它指向的对象,如果你想要对对象进行保护,则需要将其中的字段声明为final,以此类推

6.3.在其被修改之前会对自身前一个版本的内容进行备份

6.4.能避免不必要的防御式复制

7.数据库中的持久化

7.1.生命周期比程序的执行周期更长的数据

8.函数式更新

8.1.禁止使用带有副作用的方法

8.2.没有改动任何现存的数据结构

8.3.会导致过度的对象复制

9.fupdate

9.1.纯函数式

9.2.会创建一个新的树,并将其作为结果返回,通过参数的方式实现共享

10.update

10.1.每一个update的用户都希望共享同一份数据结构,也希望能了解程序任何部分所做的更新

11.延迟计算

11.1.无法声明一个递归的Stream,因为Stream仅能使用一次

11.1.1.一旦你对Stream执行一次终端操作调用,它就永久地终止了

11.2.如果它们能让程序设计更简单,就尽量使用它们

11.3.如果它们会带来无法接受的性能损失,就尝试以更加传统的方式重新实现它们

11.4.可以通过辅助方法(supplier)即时地创建列表中的元素

11.4.1.辅助方法能帮忙创建更多的数据结构

12.结合器

12.1.函数式的思想

12.2.将两个或多个函数或者数据结构进行合并

12.3.接受两个或多个方法(函数)做参数且返回结果是另一个函数的方法

13.记忆表

13.1.memoizatio)

13.2.为方法添加一个封装器,在其中加入一块缓存

13.3.遵守“引用透明性”原则的函数,其计算结构可以进行缓存

14.引用透明性原则

14.1.使用相同的参数产生同样的结果

14.2.使用equal对数据结构值进行比较

15.模式匹配

15.1.函数式的特性

15.1.1.能帮助解包数据类型

15.1.2.访问者模式

15.1.3.Java语言中switch语句的一种泛化

15.2.模式匹配为操纵类树型数据结构提供了一个极其详细又极富表现力的方式

15.2.1.Scala是面向表达式的

15.2.2.可以避免出现大量嵌套的switch或者if-then-else语句和字段选择操作相互交织的情况

15.2.3.Java的switch和if-then-else无法完全实现模式匹配的思想

15.3.用Lambda,原则上你的代码里不应该使用if-then-else

15.3.1.方法调用

15.3.1.1.myIf(condition, () -> e1, () -> e2);

15.3.1.2.

 static <T> T myIf(boolean b, Supplier<T> truecase, Supplier<T> falsecase)
 {
            return b ? truecase.get() : falsecase.get();
 }

15.3.2.Lambda表达式能以简单的方式实现单层的模式匹配

发表回复