Lambda表达式
在学习Lambda表达式之前,我们先得到了解一个知识点叫做 函数式接口
函数式接口
只有一个抽象方法的接口,叫函数式接口,它是Lamdba表达式的使用前提。
在学习多线程的时候 Runnable接口 就是一个函数式接口,如下
public interface Runnable{
public void run();
}
在学习Collections工具类的的sort方法时,我们讲到Comparator接口用于可以用于排序。
public interface Comparator<T>{
public int compare(T o1,To2);
}
匿名内部类的冗余问题
Lambda表达式可以用来解决匿名内部类代码冗余的问题,先来看一下匿名内部类的冗余问题。
public static void main(String[] args){
//创建一个线程
new Thread(new Runnable(){
//复写run方法
public void run(){
for(int i=1;i<=100;i++){
System.out.println(i);
}
}
}).start();
}
观察上面代码,我们发现创建线程对象时,需要传递一个 Runnable接口 的实现类。而 Runnable接口 的实现类又必须复写run方法。那么问题来了,仔细想想是不是这样, 既然只一个run方法,并且又必须复写run方法,倒不如不写这些代码,让编译器自动推导!!!
Lambda表达式就能解决上面匿名内部类代码冗余的问题,其实只是省略了匿名内部类的一些代码,所以有人说Lambda表达式是一个语法糖。
Lambda表达式改进
所以代码就编程这个样子
public static void main(String[] args){
//创建一个线程
new Thread(
//省略了new Runnable和run方法的声明,直接做具体的事情即可
()->{
for(int i=1;i<=100;i++){
System.out.println(i);
}
}
).start();
}
Lambda表达式的格式
Lambda表达式的格式有标准格式和好几种缺省格式。如下
1. 标准格式:
(Type1 param1,Type2 param2)->{return 语句体;}
2. 编译器都可以推断出lambda表达式的参数类型,所以参数类型可以省略
(param1,param2)->{return 语句体;}
3. 当lambda表达式的参数个数只有一个,可以省略小括号
param->{return 语句体;}
4. 当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号`;`
param->语句体
当方法的参数是函数式接口时,在调用该方法时,就可以直接传递Lamdba作为参数。这也叫函数式编程。
//有一个函数式接口
public interface MathOperation{
//对于两个整数 a和b进行计算,怎么计算不知道
public int calc(int a,int b);
}
//方法的参数是MathOperation接口
public static void test(MathOperation op){
int result=op.calc(10,20);
}
调用以上test方法时传递Lamdba表达式作为MathOperation接口的实例实现
//测试类
public class Test1{
public static void main(String[] args){
//调用test方法,传递匿名内部类作为MathOperation接口的实例
test(new MathOperation(){
public int calc(int a,int b){
//实现方式,对a和b求和
int sum=a+b;
return sum;
}
});
//使用Lambda表达式,作为MathOperation接口的实例
test((int a,int b)->{
//实现方式,对a和b求和
return a+b;
}
);
//使用Lambda缺省格式,作为MathOperation接口的实例
test((a,b)->a+b);
}
}
Lambda表达式练习2
/*
有一个数组{88,99,22,33,44,77,11,66,55},对数字升序降序排列
*/
public class Test1{
public static void main(String[] args){
Integer[] arr={88,99,22,33,44,77,11,66,55};
//sort方法第二个参数是一个Comparator接口,使用Lambda表达式作为实例接口。
Arrays.sort(arr,(o1, o2) -> o2-o1);
}
}
Ladmba总结
Lamdba表达式可以简化匿名内部类的书写,提高编写代码的效率,也是函数式编程的重要体现。