java 8 语法糖_Java8的lamada算是一种语法糖吗?
語法糖是啥?語法糖沒有一個官方的定義(或者說定義相當寬泛),更像是一種觀念:任何讓你寫著爽、但是實際發生的和你看到的不一樣的東西都可以“被認為”是語法糖。例如最常見的Integer和int的自動裝拆箱操作背后就是語法糖。看上去你在寫
Integer i = 1234;
int j = new Integer(2345);
編譯器在背后偷偷摸摸地幫你加了一些料:
Integer i = Integer.valueOf(1234); // 實際生成的字節碼的等價代碼
int j = new Integer(2345).intValue();
在Java代碼的編譯過程中有一步叫做“解語法糖”(desugar),就是做這種偷偷摸摸的事情的。
在JDK的源代碼里搜索"lambda desugar"我們可以很容易找到相關的解語法糖代碼:https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/java/lang/invoke/LambdaMetafactory.java#L181-L191?github.comhttps://github.com/openjdk/jdk/blob/master/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java#L81?github.com
/**
* This pass desugars lambda expressions into static methods
*
*
This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.
*/
public class LambdaToMethod extends TreeTranslator {這個pass(類似于“一趟掃描”的意思,在生成抽象語法樹的過程中,編譯器可能要進行多趟掃描)將lambda表達式解語法糖成為靜態方法。
* @apiNote These linkage methods are designed to support the evaluation
* of lambda expressions and method references in the Java
* Language. For every lambda expressions or method reference in the source code,
* there is a target type which is a functional interface. Evaluating a lambda
* expression produces an object of its target type. The recommended mechanism
* for evaluating lambda expressions is to desugar the lambda body to a method,
* invoke an invokedynamic call site whose static argument list describes the
* sole method of the functional interface and the desugared implementation
* method, and returns an object (the lambda object) that implements the target
* type. (For method references, the implementation method is simply the
* referenced method; no desugaring is needed.)……對Iambda表達式求值的過程會產生一個對應的目標類型(函數接口)的對象。對于每個lambda表達式的求值,推薦的方法是將lambda方法體解語法糖成為一個方法……
所以,不管你覺得是不是,也不管我覺得是不是,OpenJDK的實現認為它是。
總結
以上是生活随笔為你收集整理的java 8 语法糖_Java8的lamada算是一种语法糖吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node MySQL buffer_no
- 下一篇: java 泛型集合应用_Java泛型集合