函数式编程的优点
与面向对象编程不同的是,函数式编程更加注重于对数据进行的操作
- 代码简洁,开发快速
- 接近自然语言,易于理解
- 易于并发编程
Lambda表达式
基本格式
(参数)->{代码}
Lambda示例
如果匿名内部类是一个接口,并且只有一个方法能够重写,就可以用lambda简化,例如线程的创建。
示例1
//传统的线程创建
new Thread(new Runnable() {
public void run() {
System.out.println("新线程中run方法");
}
}).start();
}
lambda不需要关心哪个接口(new Runnable),或者哪个方法名(run),只需要关注参数和要做的事情。使用lambda简化后的代码是这样的
//Lambda简化后的线程创建
new Thread(()->{
System.out.println("新线程中run方法");
}).start();
示例2
//传统的匿名内部类
int i = calculateNum(new IntBinaryOperator() {
@Override
public int applyAsInt(int left, int right) {
return left + right;
}
});
System.out.println(i);
}
public static int calculateNum(IntBinaryOperator operator){
int a = 10;
int b = 20;
return operator.applyAsInt(a,b);
}
//Lambda表达式
int i = calculateNum((int left,int right)->{
return left+right;
});
System.out.println(i);
}
public static int calculateNum(IntBinaryOperator operator){
int a = 120;
int b = 20;
return operator.applyAsInt(a,b);
}
学好lambda表达式的神器:alt+回车,可以一键从匿名内部内转换为lambda也可以从lambda转换为匿名内部类
示例3
//匿名内部类
printNum(new IntPredicate() {
@Override
public boolean test(int value) {
return value%2==0;
}
});
}
public static void printNum(IntPredicate intPredicate){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i :arr) {
if (intPredicate.test(i)){
System.out.println(i);
}
}
}
//Lambda表达式
printNum((int value) ->{
return value%2==0;
});
}
省略规则
- 参数类型可以省略
- 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
- 方法只有一个参数时小括号可以省略
//Lambda表达式
printNum((int value) ->{
return value%2==0;
});
}
//简化后Lambda表达式
printNum(value -> value % 2==0);
}