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中含有的方法,该接口为函数式接口
}
发表回复