函数式编程:告诉他的功能是什么,而不是告诉他怎么做
命令式编程:怎么去做
函数式编程:不需要关注细节,利用系统已经有的API
使用jdk8自带函数接口的好处
函数接口减少接口定义
函数式接口链式操作
方法引用
// 方法引用
Consumer<String> consumer = s -> System.out.println(s);
Consumer<String> consumer2 = System.out::println;
consumer.accept("fffffffffffffffff");
consumer2.accept("fffffffffffffffff");
JDK默认会把当前实例传入到非静态方法中,参数名为this,位置是第一个
类型推断
变量引用
lambda表达式 – 匿名内部类 final
注意:参数传的是值,会有二义性,所以用final;是一个“坑”
级联表达式和科里化
import java.util.function.Function;
/**
* 级联表达式和柯里化
* 柯里化:把多个参数的函数转换为只有一个参数的函数
* 柯里化的目的:函数标准化
* 高阶函数:就是返回函数的函数
*/
public class CurryDemo {
public static void main(String[] args) {
// 实现了x+y的级联表达式
Function<Integer, Function<Integer, Integer>> fun = x -> y -> x
+ y;
System.out.println(fun.apply(2).apply(3));
Function<Integer, Function<Integer, Function<Integer, Integer>>> fun2 = x -> y -> z -> x
+ y + z;
System.out.println(fun2.apply(2).apply(3).apply(4));
int[] nums = { 2, 3, 4 };
Function f = fun2;
for (int i = 0; i < nums.length; i++) {
if (f instanceof Function) {
Object obj = f.apply(nums[i]);
if (obj instanceof Function) {
f = (Function) obj;
} else {
System.out.println("调用结束:结果为" + obj);
}
}
}
}
}
柯里化:把多个参数的函数转换为只有一个参数的函数
柯里化的目的:函数标准化
java值引用