函数式接口
什么是函数式接口?
只有一个抽象方法的接口即为函数式接口,举个例子,Runnable就是一个函数式接口:
package java.lang;
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
为什么要强调只有一个抽象方法?接口中的所有方法不都是抽象的吗?
- 接口可能声明Object类的方法,如toString或clone,这写声明有可能让方法不再是抽象的。(Java API中的一些接口会重新声明Object类的方法来附加javadoc注释)
- 从Java SE8开始,接口中可以声明非抽象方法。
package java.util; ... @FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); /** * 注释 */ boolean equals(Object obj); default Comparator<T> reversed() {...} default Comparator<T> thenComparing(Comparator<? super T> other) {...} ...... }
函数式接口与Labmda表达式什么关系?
当需要一个函数式接口的对象时,可以提供一个lambda表达式:
public static void main(String[] args) {
//匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello world!");
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public static void main(String[] args) {
Thread thread = new Thread(()->{
System.out.println("hello world!");
});
thread.start();
}
地势坤,君子以厚德载物。