[翻譯] Java 8 的 functional interface

看板Translate-CS作者 (痞子軍團團長)時間11年前 (2013/03/27 13:12), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串1/1
原文網址:http://www.javacodegeeks.com/2013/03/ introduction-to-functional-interfaces-a-concept-recreated-in-java-8.html 譯文網址:http://blog.dontcareabout.us/2013/03/functional-interfacejava-8.html BBS 版以 markdown 語法撰寫。 譯註: * 文章標題的完整中文翻譯應為: 「functional interface:Java 8 重新製作的概念」 * 在 Java Code Geeks 上程式碼當中的「"」都變成「'」, 這不合 Java 語法,且原文的原文網址也依然是「"」, 故校正之。 ______________________________________________________________________ 下面這些 interface,全世界各地的 Java 開發人員至少用過一個以上: `java.lang.Runnable`、`java.awt.event.ActionListener`、 `java.util.Comparator`、`java.util.concurrent.Callable`。 上述這些 interface 當中有一個共同的特點,就是它們只定義了一個 method。 JDK 當中有一堆這樣的 interface、Java 開發人員也製造了一堆。 這些 interface 也被稱為 Single Abstract Method interface(SAM interface)。 普遍常見的用法是產生一個 anonymous inner class 來使用這些 interface: 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 interface 的概念被重新製作, 取名叫作 functional interface。 method reference 跟 constructor reference 可以用 [lambda expression] 來呈現 (我接下來的 blog 文章會涵蓋這兩個主題)。 在這裡導入了一個 annotation;[@FunctionalInterface], 當你在一個不是 functional interface 的 interface 用這個 annotation, compiler 就會炸錯誤。 讓我們來看一下一個簡單的 functional interface, 裡頭只有一個 abstract method: @FunctionalInterface public interface SimpleFuncInterface { public void doWork(); } 這個 interface 也可以把 `java.lang.Object` 的 method 宣告成 abstract method, 但依然是個 functional interface: @FunctionalInterface public interface SimpleFuncInterface { public void doWork(); public String toString(); public boolean equals(Object o); } 一旦你加了另一個 abstract method 進去,compiler 或是 IDE 就會標示錯誤, 像下面這張圖這樣: ![IDE error](http://cdn.javacodegeeks.com/wp-content/uploads/ 2013/03/FuncInterface_error1.jpg) interface 如果繼承另一個 functional interface, 而且沒有宣告任何新的 abstract method, 那麼新的 interface 仍然是 functional interface。 另一種情況是 interface 當中如果有一個 abstract method、 以及任意數量的 default method, 這個 interface 依然是 functional interface。 想了解 default method 可以看[這篇文章][default method]。 @FunctionalInterface public interface ComplexFunctionalInterface extends SimpleFuncInterface { default public void doSomeWork(){ System.out.println("Doing some work in interface impl..."); } default public void doSomeOtherWork(){ System.out.println("Doing some other work in interface impl..."); } } 上面這個 interface 仍然是一個有效的 functional interface。 現在我們來看看如何用 lambda expression 實作 function interface, 做出 anonymous inner class 的效果: /* * 比對用 anonymous inner class 以及 lambda expression 的實作方式 */ public class SimpleFunInterfaceTest { public static void main(String[] args) { carryOutWork(new SimpleFuncInterface() { @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.doWork(); } } 程式輸出會長這樣: Do work in SimpleFun impl... Do work in lambda exp impl... 如果你用有支援 Java lambda expression 語法的 IDE ([Netbeans 8 Nightly build]), 那麼以上面的例子來說,會在 anonymous inner class 提供一個提示訊息: ![IDE hint](http://cdn.javacodegeeks.com/wp-content/uploads/ 2013/03/FuncInterface_hint.jpg) 這篇文章簡單地介紹了 Java 8 當中 functional interface 的觀念, 以及如何用 lambda expression 實作。 [lambda expression]: http://blog.sanaulla.info/2013/03/11/ using-lambda-expression-to-sort-a-list-in-java-8- using-netbeans-lambda-support/ [@FunctionalInterface]: http://download.java.net/lambda/b78/docs/ api/java/lang/FunctionalInterface.html [default method]: http://blog.sanaulla.info/2013/03/20/ introduction-to-default-methods-defender-methods-in-java-8/ [Netbeans 8 Nightly build]: http://bertram2.netbeans.org:8080/job/ jdk8lambda/lastSuccessfulBuild/artifact/nbbuild/ -- 錢鍾書: 說出來的話 http://www.psmonkey.org 比不上不說出來的話 Java 版 cookcomic 版 只影射著說不出來的話 and more...... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.23.213

03/27 14:05, , 1F
functional programming正夯XD
03/27 14:05, 1F

03/27 15:03, , 2F
帳面上看起來比較像 syntax sugar
03/27 15:03, 2F

03/27 16:59, , 3F
網址可以縮嗎~
03/27 16:59, 3F

03/27 17:00, , 4F
請參閱 blog 版 [逃]
03/27 17:00, 4F

03/27 17:29, , 5F
Java 越來越像 Scala =3=
03/27 17:29, 5F
修改最後一個範例的 typo ※ 編輯: PsMonkey 來自: 114.25.4.190 (03/27 22:08)
文章代碼(AID): #1HKd-u6o (Translate-CS)
文章代碼(AID): #1HKd-u6o (Translate-CS)