請不要吐槽太多,我才剛開始翻譯文章
函數式介面簡介 - Java 8 中重新建立的概念
世界上的每個 Java 開發人員都至少使用過以下介面之一:java.lang.Runnable
、java.awt.event.ActionListener
、java.util.Comparator
、java.util.concurrent.Callable
。它們都有一個共同點,那就是它們都只有一種方法。JDK 中還有許多其他此類接口,以及 Java 開發人員創建的其他接口。這些介面也稱為Single Abstract Method interfaces
(SAM 介面)。使用這些介面的最流行的方法之一是建立使用這些介面的匿名內部類,如下例所示:
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
在 Java 8 中,重新建立了 SAM 概念,並將其稱為函數式介面。它們可以使用 lambda 表達式、方法引用和引用建構子來表示。建立了一個新的 @FunctionalInterface 註釋,當您註釋的介面在功能層級不起作用時,該註釋用於在編譯器層級引發錯誤。讓我們來看看帶有一個抽象方法的簡單函數式介面:
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
介面也可以宣告類別的抽象方法java.lang.Object
,但在這種情況下,介面也可以宣告為函數式:
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
一旦您在介面中新增了另一個抽象方法,IDE 就會將其標記為錯誤,如圖所示:
一個介面可以繼承另一個介面;如果該介面繼承自函數式介面並且不包含新的抽象方法,則該介面也是函數式介面。但是一個介面只能包含一個抽象方法和許多預設方法,並且它仍然被認為是函數式的。
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
上面的例子仍然是一個函數式介面。現在讓我們看看如何使用 lambda 表達式來取代匿名內部類別來實作函數式介面:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
程序的結果如下:
Do work in SimpleFun impl...
Do work in lambda exp impl...
如果您使用的 IDE 支援 Java lambda 表達式語法(Netbeans 8 Nightly builds),那麼您在使用匿名內部類別時會得到提示: 這是 Java 8 中函數式介面的概念以及如何實現它們的簡要介紹使用lambda表達式。
GO TO FULL VERSION