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

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

时间:2023-02-15 07:11:43浏览次数:51  
标签:10 15.3 Java 函数 编程 参数 使用 数据结构 方法

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表达式能以简单的方式实现单层的模式匹配

标签:10,15.3,Java,函数,编程,参数,使用,数据结构,方法
From: https://www.cnblogs.com/lying7/p/17109126.html

相关文章

  • 实现C++和C的混合编程
    实现C++和C的混合编程在C++出现之前,很多实用的功能都是用C语言开发的,很多底层的库也是用C语言编写的。这意味着,如果能在C++代码中兼容C语言代码,无疑能极大地提......
  • 强力推荐 10 个值得开发者自学的 GitHub 库
    强力推荐10个值得开发者自学的GitHub库“许多优秀的人都是自学而成的”-HerbRitts对于很多人来说,“自学型开发者”这个术语是一个有矛盾的术语。事实上,在某种程......
  • 第 5 课、java和rest-assured
                               packagecom.les.java.day01;importorg.apache.log4j.Logger;publicclass......
  • java基础之Object中的toString()方法
    toString()方法返回该对象的字符串表示。该字符串由类名、@、和次对象哈希码值的16进制表示组成,换句话说就是原理分析:全限定路径:包名+类名hascode()---》将对象在堆中......
  • java基础之super
    super属性和方法指的是:父类super可以修饰属性,修饰方法。在子类的方法中,可以通过super属性,super方法的方式,显式的去调用父类的属性和犯法,在通常情况下,super.可以省略不写......
  • JavaConfig
    使用Java的方式配置spring我们现在完全不使用spring的xml配置了,全权交给Java来做!JavaConfig是spring的一个子项目,在spring4之后,它成为一个核心功能!1.实体类packageto......
  • 第5章 函数式编程**-函数和方法,高阶函数,匿名函数,函数柯里化,闭包,递归,控制抽象(传值参数,
    第5章函数式编程-函数和方法,高阶函数,匿名函数,函数柯里化,闭包,递归,控制抽象(传值参数,传名参数),惰性加载目录第5章函数式编程-函数和方法,高阶函数,匿名函数,函数柯里化,闭包......
  • 10.11 循环处理的实现方法
    接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器连续进行10次循环的C语言......
  • 10.12 条件分支的实现方法
       代码清单10-12中用到了三种跳转指令,分别是比较结果小时跳转的jle、大时跳转的jge、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比......
  • Java报错:Failed to start bean ‘documentationPluginsBootstrapper‘
    场景描述SpringBoot引入knife4j+Swagger报错Failedtostartbean'documentationPluginsBootstrapper'引入版本<parent> <groupId>org.springframework.boot</grou......