A.简单概述:
函数式接口:有且仅有一个抽象方法的接口。Java中的函数式编程就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口,只有确保接口中只有一个抽象方法,Java中的Lambda表达式才能顺利进行推导。
B.如何检测接口是否为函数式接口:
在接口定义的上方放上“ @Functionionallnterface ”如果是函数式接口,编译通过,否则编译失败。
注意 :我们自己定义函数式接口时@Functionionallnterface说可选的,就算不写它只要满足函数式接口的条件即可。但是建议加上。
a.代码案例:
package demo122;
public class MyInterfaceDemo {
public static void main(String[] args) {
//用作局部变量
MyInterface my = (() -> System.out.println("函数式接口。。。"));
my.show();
}
}
package demo122;
@FunctionalInterface
public interface MyInterface {
void show();
}
C.函数式接口作为方法的参数:
如果方法的一个参数是函数式接口,我们可以使用Lambda表达式作为参数传递。
a.代码案例:
首先我们在idel中Ctrl + b 跟进查看Runnable接口的源码;
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
我们不难发现,该接口为一个函数式接口。
再看案例:
package demo122;
public class RunnableDemo {
public static void main(String[] args) {
//在主方法中调用startThread()方法
startThread(() -> {
System.out.println(Thread.currentThread().getName() + "启动啦。。。。");
});
}
//startThread(Runnable r) 方法参数是一个函数式接口
private static void startThread(Runnable r) {
//线程的实现方法2
Thread t = new Thread(r);
//设置线程名称
t.setName("我自命名的线程");
//启动线程
t.start();
}
}
我自命名的线程启动啦。。。。 Process finished with exit code 0
D.函数式接口作为方法的放回值:
如果方法的放回值是一个函数式接口,我们可以使用Lambda表达式作为结果返回。
a.代码演示:
public class ComparatorDemo {
public static void main(String[] args) {
//构造使用场景
//定义集合,储存字符串元素
ArrayList array = new ArrayList<>();
array.add("cccc");
array.add("aa");
array.add("b");
array.add("ddd");
System.out.println("排序前:" + array);
Collections.sort(array, getComparator());
System.out.println("排序后:" + array);
}
//Comparator getComparator() 方法返回值是一个函数式接口
private static Comparator getComparator() {
return (String s1, String s2) -> {
return s1.length() - s2.length();
};
}
}
排序前:[cccc, aa, b, ddd] 排序后:[b, aa, ddd, cccc] Process finished with exit code 0



