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