Java 7的第一類函數(shù):學(xué)習(xí)閉包的使用
本文來(lái)自Liuu的博客,原文標(biāo)題為《Java7準(zhǔn)備讓函數(shù)成為一等公民》。
如果你是一個(gè)Java程序員,你認(rèn)識(shí)“#”么?讓我猜猜看,應(yīng)該不太熟吧。因?yàn)樵贘ava1.4.2時(shí)代,“#”僅僅用于在編寫(xiě)javadoc的注釋內(nèi)容,用于鏈接(@see)到對(duì)應(yīng)類的具體方法。除此之外,在編寫(xiě)代碼的時(shí)候,我們幾乎不會(huì)用到它。
51CTO編輯推薦:Java 7,下一代Java開(kāi)發(fā)技術(shù)詳解
不過(guò),別驚訝,在Java 7發(fā)布之后,“#”或許將成為Java程序員最熟悉的朋友!因?yàn)樵趲滋烨埃?1CTO編輯注:本文翻譯于09年11月底,當(dāng)時(shí)Sun剛剛公布說(shuō)Java 7將包含簡(jiǎn)單的閉包),Sun的Java SE和OpenJDK的首席工程師Mark Reinhold,剛剛宣布Java 7將加入一個(gè)簡(jiǎn)化版的“閉包”特性,其中的關(guān)鍵符號(hào),就是“#”。也因?yàn)檫@個(gè)原因,Java 7的正式發(fā)布時(shí)間,將從2010年2月份,推遲到9月份。
在Java 7中,“#”將讓函數(shù)方法,成為Java語(yǔ)言的一等公民。下面來(lái)看看如何用#語(yǔ)法實(shí)現(xiàn)“閉包”的吧:
簡(jiǎn)單的方法引用示例:
比如要引用String類的equals方法,應(yīng)該這么寫(xiě):
- String#equals(Object)
再看一個(gè)例子:
- java.io.File#exists()
事件監(jiān)聽(tīng)器1 (代碼示例,來(lái)自Cay Horstmann)
使用閉包前:
- button.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent ){
- System.out.println("Hi!"); }
- }
- );
使用閉包后 :
- button.addActionListener(#(ActionEvent e) System.out.println("Hi!));
事件監(jiān)聽(tīng)器2(代碼示例,來(lái)自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
- }
排序比較器(代碼示例,來(lái)自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();
- });
甚至或簡(jiǎn)化成:
- Collections.sort(strings,
- #(String a, String b) a.length() - b.length());
最后,我們復(fù)習(xí)一下javadoc中的#的用法:
引用當(dāng)前類的成員字段、方法、構(gòu)造器
- @see#field
- @see#method(Type, Type,...)
- @see#method(Type argname, Type argname,...)
- @see#constructor(Type, Type,...)
- @see#constructor(Type argname, Type argname,...)
引用已經(jīng)導(dǎo)入的類的成員字段、方法、構(gòu)造器,或嵌套類
- @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#以前曾經(jīng)翻譯過(guò)一篇文章離開(kāi)Java,尋找更佳語(yǔ)言的10大理由(更新),現(xiàn)在看來(lái)Java或許已經(jīng)聽(tīng)到了太多這樣的聲音。因此,在Java 7中,里面提到的大部分問(wèn)題都得到了改進(jìn),甚至包括現(xiàn)在突然宣布要加入的閉包,并讓函數(shù)成為一等公民。這應(yīng)該是一件好事,只是,有個(gè)小小的疑惑,Java似乎越來(lái)越像Ruby這樣的動(dòng)態(tài)語(yǔ)言了,Java 7還會(huì)是我們熟悉的Java么?