Scala 2.12 擁抱 Java 8

jopen 9年前發布 | 28K 次閱讀 Scala

在今年(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表達式的位置。

               
//Scala code
new Thread(() => println("running")).start

在Java代碼中,可以使用Lamabda表達式作為函數對象應用在=>表達式的位置:

               
//Java code
scalaCollection.foreach(x-> println(x))

這樣Scala和Java Lambda表達式實現了互操作。

之所以能這樣替換,是因為Scala 2.12將lambda表達式編譯的字節碼和Java的字節碼是一致的,而不是匿名函數的方式。
因此在Scala代碼中,函數式接口(Functional interfaces,也叫SAM)都可以通過Scala的 =>實現。

在看一個Java Stream中使用函數式接口SAM的例子:

               
// Java example:
stream.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

在Scala中代碼中我們使用=>實現這些SAM:

               
// Scala
import java.util.stream.Stream
var s = Stream of ("a1","a2","b1","c2","c1")
s.filter(s => s.startsWith("c"))
.map(_.toUpperCase).sorted.forEach(println)

毫無違和感。

Java中使用Scala類庫時遇到SAM時:
在Scala 2.12中, FunctionN是函數式接口:

               
// Java code:
scalaCollection.foreach(x -> println(x));

在Scala 2.11中,要使用兼容包,JFunctionN是函數式接口。

               
// Java code:
import static scala.compat.java8.JFunction.*;
scalaCollection.foreach(func(x -> println(x)));

編譯Trait時使用缺省方法 (Make use of default methods )

比如下面一個trait:

               
trait F1 {
def apply
def add(x:Int, y:Int) = x+y
}

會被編譯成兩個類:

               
public abstract interface F1
{
public abstract void apply();
public abstract int add(int paramInt1, int paramInt2);
}
public abstract class F1$class
{
public static int add(F1 $this, int x, int y)
{
return x + y;
}
public static void $init$(F1 $this)
{
}
}

有幾種方案來編譯成SAM。一種就是

               
public interface F1
{
public abstract void apply();
public default int add(int paramInt1, int paramInt2) {
return F1$class.add(paramInt1, paramInt2)
}
}

或者直接編譯成SAM,不需要一個輔助類F1$class

可以關注Scala 2.12正式發布后的實現方式。

來自:http://colobu.com/2015/07/16/Scala-2-12-Embraces-Java-8/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!