知识点
函数式接口:有且只有一个抽象方法的接口,称之为函数式接口
当然接口中可以包含其他的方法(默认,静态,私有)
@FunctionalInterface注解
作用:可以检测接口是否是一个函数式接口
是:编译成功
否:编译失败(接口中没有抽象方法抽象方法的个数多余1个)
@FunctionalInterface
public interface MyFunctionalInterface {
//定义一个抽象方法
public abstract void method();
}
函数式接口的使用:一般可以作为方法的参数和返回值类型
public class MyFunctionalInterfaceImpl implements MyFunctionalInterface {
@Override
public void method() {
}
}
public class Demo {
//定义一个方法,参数使用函数式接口MyFunctionalInterface
public static void show(MyFunctionalInterface myInter){
myInter.method();
}
public static void main(String[] args) {
//调用show方法,方法的参数是一个接口,所以可以传递接口的实现类对象
show(new MyFunctionalInterface() {
@Override
public void method() {
}
});
show(new MyFunctionalInterfaceImpl());
//调用show方法,方法的参数是一个函数式接口,所以我们可以Lambda表达式
show(()->{
System.out.println("使用Lambda表达式重写接口中的抽象方法");
});
//简化Lamba表达式
show(()-> System.out.println("使用Lambda表达式重写接口中的抽象方法"));
}
}
如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。
当需要通过一个方法来获取一个java.util.Comparator接口类型的对象作为排序器时,就可以调该方法获取。
public class Comparator {
//定义一个方法,方法的返回值类型使用函数式接口Comparator
public static java.util.Comparator<String> getComparator(){
//方法的返回值类型是一个接口,那么我们可以返回这个接口的匿名内部类
//一
/* return new java.util.Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 02-01;
}
};
*/
//二
return ((o1, o2) -> o2.length()-o1.length());
}
}
例如java.lang.Runnable接口就是一个函数式接口,
假设有一个startThread方法使用该接口作为参数,那么就可以使用Lambda进行传参。
这种情况其实和Thread类的构造方法参数为Runnable没有本质区别。
public class Runnable {
//定义一个方法startThread,方法的参数使用函数式接口Runnable
public static void startThread(java.lang.Runnable run) {
//开启多线程
new Thread(run).start();
}
public static void main(String[] args) {
//调用startThread方法,方法的参数是一个接口,那么我们可以传递这个接口的匿名内部类
startThread(new java.lang.Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->" + "线程启动了");
}
});
//调用startThread方法,方法的参数是一个函数式接口,所以可以传递Lambda表达式
startThread(() ->
System.out.println(Thread.currentThread().getName() + "-->" + "线程开启"));
//优化Lambda表达式
startThread(()-> System.out.println(Thread.currentThread().getName()));
}
}