一、什么是函数式编程
函数式编程是一种编程范式,以函数作为第一对象。注重描述而非具体执行步骤(比如SQL只声明需要什么数据,具体数据库怎么查没指定)
二、特性
三、应用场景
四、Lambda表达式
思考:a -> b -> c -> "d" 代表什么?
a的返回值是一个函数(b -> c -> "d" )
b的返回值还是一个函数( c -> "d")
最后就是一个lambda表达式 c -> "d"
它的意思是将a的入参传递给b函数,b函数将a入参再传给c,c函数传入入参执行"d"操作返回最终结果值
4.1)引入lambda表达式后带来的问题
4.2)函数式接口 SAM(Single Abstract Method)
4.3)内置常用函数式接口
4.4)函数的调用
ff(String){
}
ff只是方法签名中的方法名,既不是一种类型,也不是一个表达式
所以Function f = ff?这种编写方式不可以,那如何将方法名ff进行使用呢
JAVA8提供了方法引用
4.5)方法引用
五、函数接口转换
六、CPS (continuation-passing style)
正常同步方法:
result1 = f1(String a); //方法f1执行返回结果result1
void f2(result1); //方法f2传入result1继续下一步逻辑...
CPS常见的就是callback方法:
void f1(String a, Consumer<Object> callback); //f1()方法没有返回值,但是传入参数a执行后返回的结果会继续传递给Object执行下一个函数callback
七、Stream
7.1)概述
7.2)理解Stream.reduce()
7.3)reduce实战
函数式编程的好处,比如方法不想抛异常:
f1 throw SQLException();
f1WithoutThrowExce(){
try{
f1();
}
}
假如来了一个f2,需要重新写一个 f2WithoutThrowExce();有了函数式编程之后可无限复用
fnWithoutThrowExce(Function<T, R> fn){
return arg -> {
try{
fn.apply(arg);
}
}
}
7.4)理解Stream.collect()
Collector接口
Collectors工具类