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/