Scala 2.12 擁抱 Java 8
在今年(2015)的舊金山的ScalaDays會議上,來自Scala核心團隊的Lukas Rytz分享了一個演講:The JVM Backend and Optimizer in Scala 2.12的技術細節,主要基于Java 8平臺上一些改變, 比如Lambda, 缺省方法等。第二部分主要介紹了生成的字節碼的優化。
本文是對第一部分做的筆記。
因為2.12還沒有正式發布,一下特性可能還無法校驗。
函數互操作 (Interop for functions: source and bytecode )
Scala 2.12只能運行在Java 8上。
Scala和Java8實現互操作。
在Scala代碼中,可以使用=>
表達式應用在Java Lambda表達式的位置。
|
在Java代碼中,可以使用Lamabda表達式作為函數對象應用在=>
表達式的位置:
|
這樣Scala和Java Lambda表達式實現了互操作。
之所以能這樣替換,是因為Scala 2.12將lambda表達式編譯的字節碼和Java的字節碼是一致的,而不是匿名函數的方式。
因此在Scala代碼中,函數式接口(Functional interfaces,也叫SAM)都可以通過Scala的 =>
實現。
在看一個Java Stream中使用函數式接口SAM的例子:
|
在Scala中代碼中我們使用=>
實現這些SAM:
|
毫無違和感。
Java中使用Scala類庫時遇到SAM時:
在Scala 2.12中, FunctionN是函數式接口:
|
在Scala 2.11中,要使用兼容包,JFunctionN是函數式接口。
|
編譯Trait時使用缺省方法 (Make use of default methods )
比如下面一個trait:
|
會被編譯成兩個類:
|
有幾種方案來編譯成SAM。一種就是
|
或者直接編譯成SAM,不需要一個輔助類F1$class
。
可以關注Scala 2.12正式發布后的實現方式。
來自:http://colobu.com/2015/07/16/Scala-2-12-Embraces-Java-8/