Translate-CS 板


LINE

原文網址: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
1F:推 dryman:functional programming正夯XD 03/27 14:05
2F:→ PsMonkey:帳面上看起來比較像 syntax sugar 03/27 15:03
3F:→ swpoker:網址可以縮嗎~ 03/27 16:59
4F:→ PsMonkey:請參閱 blog 版 [逃] 03/27 17:00
5F:推 coolcomm:Java 越來越像 Scala =3= 03/27 17:29
修改最後一個範例的 typo ※ 編輯: PsMonkey 來自: 114.25.4.190 (03/27 22:08)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP