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