java8 函数式编程简介
函数作为一等公民
一个函数可以作为另一个函数的返回值.
//js 中
function f1(){
var n=1;
function f2(){alert(n);
}
return f2;
}
var result=f1();
result(); //1
无副作用
副作用指的是函数在调用过程中, 除了给出返回值, 还修改函数外部的状态.
函数式编程认为, 函数的副作用应该尽量被避免.
注意:
显示函数: 与外界交换数据的唯一渠道是参数和返回值, 不会读取或修改函数的外部状态
隐式函数: 除参数和返回值外, 还会读取 / 修改外部信息.
声明式
命令式: 使用可变对象和指令
声明式: 需要提供明确的指令操作
// 命令式
public static void imperative(){int[] iArr={1,3,4,5,6,9,7,8,4,2};
for(int i=0;i<iArr.length;i++){System.out.println(iArr[i]);
}
}
// 声明式
public static void declarative(){int[] iArr={1,3,4,5,6,9,7,8,4,2};
Arrays.stream(iArr).forEach(System.out::println);
}
不变的对象
函数式编程中, 几乎所有传递的对象都不会被轻易修改
int[] iArr={1,3,4,5,6,9,7,8,4,2};
Arrays.stream(arr).map((x)->x=x+1).forEach(System.out::println); // 输出 + 1 的数组
System.out.println();
Arrays.stream(arr).forEach(System.out::println); // 原数组不变
易于并行
不变模式不需要关心线程安全问题, 多线程下性能更好.
更少的代码
简洁明了, 代码更少
函数式编程基础
FunctionalInterface 注释
函数式接口只能有一个抽象方法, 任何被 Object 实现的方法, 都不能被视为抽象方法
@FunctionalInterface
public static interface IntHandler{void handle(int i)
}
@FunctionalInterface
public static interface IntHandler{void handle(int i);
boolean equals(Object obj); //object 中含有的方法, 该接口为函数式接口
}