Java 8決定采用跟C#一樣的Lambda句法
原創(chuàng)鑒于Java 7 SE(標(biāo)準(zhǔn)版)現(xiàn)已正式發(fā)布,甲骨文和Java社區(qū)進(jìn)程組織(JCP)的成員們已開始仔細(xì)考慮為這種編程語言的下一個版本Java SE 8添加什么功能特性。前段時間曝光將為Java 8提上議程的工作是:設(shè)計面向云計算的Java。近日又有提出了對Java 8語法上的改變:Java 8 將采用跟C#一樣的Lambda句法。
lambda-dev在郵件列表宣布,Java的Lambda語法決定基于C#語法。這種語法在C#語言里已經(jīng)使用很長時間了(C#在1.0時期便引入了委托類型,并在2.0里支持匿名函數(shù),3.0對Lambda表達(dá)式提供支持)。
這種語法同時支持表達(dá)式和代碼塊。表示式的形式不需要大括號,并且在執(zhí)行后返回結(jié)果。語法塊的形式需要使用大括號,除非使用了return關(guān)鍵字,否則不會直接返回結(jié)果。郵件里也給出了示例:
C#的語法是:
- lambda = ArgList Arrow Body
- ArgList = Identifier
- | "(" Identifier [ "," Identifier ]* ")"
- | "(" Type Identifier [ "," Type Identifier ]* ")"
- Body = Expression
- | "{" [ Statement ";" ]+ "}"
這里是使用lambda表達(dá)式這種語法的一些例子:
- x => x + 1
- (x) => x + 1
- (int x) => x + 1
- (int x, int y) => x + y
- (x, y) => x + y
- (x, y) => { System.out.printf("%d + %d = %d%n", x, y, x+y); }
- () => { System.out.println("I am a Runnable"); }
Lambda表達(dá)式的關(guān)鍵優(yōu)勢,在于它們會對參數(shù)進(jìn)行類型推斷。不過在某些情況下,編譯器依然無法推斷出正確類型(尤其是出現(xiàn)操作符重載的時候,例如:(x, y) => x + y 在Java編譯器不知道x和y是int還是double時候)。一般來說,類型推斷引擎都能自動得出正確的代碼,如果需要更多提示,程序員也始終可以顯示地增加類型信息。
不久的將來會發(fā)布支持新語法的編譯器以供體驗。
參考原文:http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html
【編輯推薦】