函数式接口概述
函数式接口:有且仅有一个抽象方法的接口
Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口
只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导
如何检测一个接口是不是函数式接口
- @FunctionalInterface
- 放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是则失败
注意
- 自定义函数式接口时,@FunctionalInterface是可选的,就算不写,只要保证满足函数式接口定义的条件,也照样是函数式接口。但是,建议加上该注解
函数式接口作为方法的参数
如果方法的参数是一个函数式接口,可以使用Lambda表达式作为参数传递
- startThread(()-> System.out.println(Thread.currentThread().getName()+“线程启动了”));
public class RunnableDemo {
public static void main(String[] args) {
//在主方法中调用startThread方法
//匿名内部类
startThread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动了");
}
});
//Lambda表达式
startThread(()-> System.out.println(Thread.currentThread().getName()+"线程启动了"));
}
private static void startThread(Runnable r) {
// Thread t = new Thread(r);
// t.start();
new Thread(r).start();
}
}
函数式接口作为方法的返回值
如果方法的参数是一个函数式接口,可以使用Lambda表达式作为结果返回
- private static Comparator getComparator() {
return (s1, s2)->s1.length()-s2.length();
}
public class ComparatorDemo {
public static void main(String[] args) {
//构造使用场景
//定义集合,存储字符串元素
ArrayList<String> array = new ArrayList<String>();
array.add("cccc");
array.add("aa");
array.add("b");
array.add("ddd");
System.out.println("排序前"+array);
// Collections.sort(array);//自然排序,字母顺序
Collections.sort(array,getComparator());
System.out.println(