一、介绍接口实现的三种方法,引出Lambda表达式。
定义接口(comparator):
1 | interface comparator{ |
定义实现类(Mycomparator):
1 | class Mycomparator implements comparator{ //实现类必须实现接口里面的所有抽象方法 |
- 1.使用接口实现类
1
2
3
4
5
6public class ChengXu{
public static void main(String[] args){
comparator comparator1=new Mycomparator(); //多态(左边父类,右边子类) 编译在左,实现在右
comparator1.compare;
}
}
- 2.使用匿名接口类
1
2
3
4
5
6
7
8
9
10public class ChengXu{
public static void main(String[] args){
comparator comparator2=new comparator(){ //哪个接口要实现就写哪个接口的匿名抽象类
@override
public int compare(int a,int b){
return a-b;
}
}
}
}
- 3.使用Lambda表达式
1
2
3
4
5public class ChengXu{
public static void main(String[] args){
comparator comparator3=(a,b) ->a-b;
}
}
二、Lambda表达式的基本语法
1.Lambda表达式只能描述只有一个抽象方法的接口(@FunctionalInterface注释)。
2.也可以用于集合类中遍历集合元素。
3.包含三个部分:
- 形参列表:允许省略参数类型。(一个参数的话可以省略形参的圆括号)。
- 箭头(->):必须有英文画线和大于符号组成。
- 代码块:如果只有一句,省略”{}”。
- java8中引入了一个新的操作符”->”(箭头操作符/Lambda操作符),将Lambda表达式拆分为两个部分:
- 左边:Lambda表达式的参数列表(实现的抽象方法参数相同)
- 右边:Lambda表达式中所需要的功能(方法体)
三、函数式接口
代表只含有一个抽象方法的接口(默认方法、类方法可以有很多)。
JAVA8专门为函数式接口提供了@FunctionalInterface注解。放在接口定义的前面,用于告诉编译器执行更为严格检查,不是函数式接口就会报错。
例如:
1 | Runnable r=()->{ |
解释:
Lambda表达式实现的是匿名方法(只能实现特定函数式接口的唯一方法),因此就有两个限制:
- Lambda表达式的目标类型必须是明确的函数式接口。(我觉得最适合的就是(参数列表强制类型转换))
- Lambda表达式只能为函数式接口创建对象。
Java在java.util.function包下面预定义了很多函数式接口
- XxxFunction:这类接口中通常有一个apply()抽象方法,对参数处理后返回一个新的值。
- XxxConsumer:这类接口中通常有一个accept()抽象方法,对参数处理后但是不返回新的值。
- XxxPredicate:这类接口中通常有一个test()抽象方法,对参数进行某种处理后返回一个boolean值,用于筛选数据。
- XxxSupplier:这类接口中通常有一个getAsXxx()抽象方法,不需要输入一个值通过某种算法返回一个值。
四、方法引用和构造器引用
如果Lambda表达式的代码块只有一条代码,那么就可以在代码块中使用方法引用和构造器引用。