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

1、无处不在的函数

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

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

1.高阶函数

能知足下面任一要求就能够被称为高阶函数(higher-order function):app

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

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

用不一样的方式实现类型定义,以下所示:spa

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

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

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

其实两者说的是同一件事。code

2.科里化

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

固然,咱们能够由此推出:你能够将一个使用了6个参数的函数科里化成一个接受第二、四、6号参数,并返回一个接受5号参数的函数,这个函数又返回一个接受剩下的第1号和第3号参数的函数。一个函数使用全部参数仅有部分被传递时,一般咱们说这个函数是部分应用的(partially applied)。递归

2、持久化数据结构

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

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

图片描述

3、Stream 的延迟计算

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

4、匹配模式

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

相关文章
相关标签/搜索