[翻译] Java 8 的 functional interface

楼主: PsMonkey (痞子军团团长)   2013-03-27 13:12:20
原文网址: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/
作者: dryman (dryman)   2013-03-27 14:05:00
functional programming正夯XD
楼主: PsMonkey (痞子军团团长)   2013-03-27 15:03:00
帐面上看起来比较像 syntax sugar
作者: swpoker (swpoker)   2013-03-27 16:59:00
网址可以缩吗~
楼主: PsMonkey (痞子军团团长)   2013-03-27 17:00:00
请参阅 blog 版 [逃]
作者: coolcomm (coolcomm)   2013-03-27 17:29:00
Java 越来越像 Scala =3=

Links booklink

Contact Us: admin [ a t ] ucptt.com