Lambda表达式
Lambda概述
- Lambda表达式是JDK8开始后的一种语法形式
- 作用:简化匿名内部类的代码写法
Lambda表达式的简化格式
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码;
}
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
什么是函数式接口?
- 首先必须是接口、其次接口中有且只有一个抽象方法的形式
- 通常会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口
public class LambdaDemo1 {
public static void main(String[] args) {
//Lambda只能简化接口中只有一个抽象方法的匿名内部类形式
//lambda简化之前的形式
/* Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("老师游泳很快!!!");
}
};*/
//Lambda简化后的形式
Swimming s = () -> {
System.out.println("老师游泳很快!!!");
};
go(s);
System.out.println("----------------------");
//这里是将上面的s对象整体作为参数放入到go函数中 只不过这里方法体不一样
go(() -> {
System.out.println("学生游泳很快!!!");
});
}
public static void go(Swimming s){
System.out.println("开始!!!");
s.swim();
System.out.println("结束!!!");
}
}
@FunctionalInterface //一旦加上这个注解 必须是函数式接口,里面只能有一个抽象方法
interface Swimming{
void swim();
}
常见案例:
Integer[] arr = {18,29,90,34,43,2,17};
//自定义比较器对象 可以降序排序
//这里的 new Comparator<Integer>实际上是创建了一个匿名内部类的对象 并且在内部重写了compare方法 也就是自己定义比较规则
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // o2 - o1 降序 o1 - o2 升序
}
});
//简化后
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1; // o2 - o1 降序 o1 - o2 升序
});
System.out.println(Arrays.toString(arr));
Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果Lambda表达式的方法体只有一行代码。可以省略大括号不写,同时要省略分号
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也要省略分号";"不写
//简化前
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1; // o2 - o1 降序 o1 - o2 升序
});
//简化后 省略数据类型
Arrays.sort(arr, ( o1, o2) -> {
return o2 - o1; // o2 - o1 降序 o1 - o2 升序
});
//继续简化 省略{} 和 ;
Arrays.sort(arr, ( o1, o2) -> o2 - o1 );
// o2 - o1 降序 o1 - o2 升序
//简化前
Swimming s = () -> {
System.out.println("老师游泳很快!!!");
};
//简化后 省略{}和;
Swimming s = () -> System.out.println("老师游泳很快!!!");
1.Lambda表达式的基本作用
简化函数式接口的匿名内部类的写法
2.Lambda表达式有什么使用前提
必须是接口的匿名内部类,接口中只能有一个抽象方法
3.Lambda的好处
Lambda是一个匿名函数,Lambda表达式可以理解成一段可以传递的代码,可以使代码更加简洁、更灵活。