Java 7的第一類函數:學習閉包的使用
本文來自Liuu的博客,原文標題為《Java7準備讓函數成為一等公民》。
如果你是一個Java程序員,你認識“#”么?讓我猜猜看,應該不太熟吧。因為在Java1.4.2時代,“#”僅僅用于在編寫javadoc的注釋內容,用于鏈接(@see)到對應類的具體方法。除此之外,在編寫代碼的時候,我們幾乎不會用到它。
51CTO編輯推薦:Java 7,下一代Java開發技術詳解
不過,別驚訝,在Java 7發布之后,“#”或許將成為Java程序員最熟悉的朋友!因為在幾天前(51CTO編輯注:本文翻譯于09年11月底,當時Sun剛剛公布說Java 7將包含簡單的閉包),Sun的Java SE和OpenJDK的首席工程師Mark Reinhold,剛剛宣布Java 7將加入一個簡化版的“閉包”特性,其中的關鍵符號,就是“#”。也因為這個原因,Java 7的正式發布時間,將從2010年2月份,推遲到9月份。
在Java 7中,“#”將讓函數方法,成為Java語言的一等公民。下面來看看如何用#語法實現“閉包”的吧:
簡單的方法引用示例:
比如要引用String類的equals方法,應該這么寫:
- String#equals(Object)
再看一個例子:
- java.io.File#exists()
事件監聽器1 (代碼示例,來自Cay Horstmann)
使用閉包前:
- button.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent ){
- System.out.println("Hi!"); }
- }
- );
使用閉包后 :
- button.addActionListener(#(ActionEvent e) System.out.println("Hi!));
事件監聽器2(代碼示例,來自FSM )
使用閉包前:
- public void init() {
- JButton button = ...;
- button.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent ev) {
- handleAction(ev);
- }
- });
- }
- public void handleAction(ActionEvent ev) {
- // handle event
- }
使用閉包后:
- public void init() {
- JButton button = ...;
- button.addActionListener(this#handleAction(ActionEvent));
- }
- public void handleAction(ActionEvent ev) {
- // handle event
- }
排序比較器(代碼示例,來自FSM 、Cay Horstmann)
使用閉包前:
- List<String> list = ...
- Collections.sort(list, new Comparator<String>() {
- public int compare(String str1, String str2) {
- return str1.length() - str2.length();
- }
- });
使用閉包后:
- List<String> list = ...
- Collections.sort(list, #(String str1, String str2) {
- return str1.length() - str2.length();
- });
甚至或簡化成:
- Collections.sort(strings,
- #(String a, String b) a.length() - b.length());
最后,我們復習一下javadoc中的#的用法:
引用當前類的成員字段、方法、構造器
- @see#field
- @see#method(Type, Type,...)
- @see#method(Type argname, Type argname,...)
- @see#constructor(Type, Type,...)
- @see#constructor(Type argname, Type argname,...)
引用已經導入的類的成員字段、方法、構造器,或嵌套類
- @seeClass#field
- @seeClass#method(Type, Type,...)
- @seeClass#method(Type argname, Type argname,...)
- @seeClass#constructor(Type, Type,...)
- @seeClass#constructor(Type argname, Type argname,...)
- @seeClass.NestedClass
- @seeClass
引用其他包里的類成員
- @seepackage.Class#field
- @seepackage.Class#method(Type, Type,...)
- @seepackage.Class#method(Type argname, Type argname,...)
- @seepackage.Class#constructor(Type, Type,...)
- @seepackage.Class#constructor(Type argname, Type argname,...)
- @seepackage.Class.NestedClass
- @seepackage.Class
- @seepackage
#t#以前曾經翻譯過一篇文章離開Java,尋找更佳語言的10大理由(更新),現在看來Java或許已經聽到了太多這樣的聲音。因此,在Java 7中,里面提到的大部分問題都得到了改進,甚至包括現在突然宣布要加入的閉包,并讓函數成為一等公民。這應該是一件好事,只是,有個小小的疑惑,Java似乎越來越像Ruby這樣的動態語言了,Java 7還會是我們熟悉的Java么?