我正在學習Scala,我有一個Java項目遷移到斯卡拉。我想通過逐個重寫類並檢查新類沒有破壞項目來遷移它。Java <->斯卡拉interop:透明列表和地圖轉換
該Java項目使用大量的java.util.List
和java.util.Map
。在新的Scala課程中,我希望使用Scala的List
和Map
以獲得好看的Scala代碼。
問題是,新類(這些是Scala中的wtitten)沒有與現有Java代碼無差別地集成在一起:Java需要java.util.List
,Scala需要它自己的scala.List
。
這是一個簡化的問題示例。有類主,邏輯,道。他們互相呼叫:Main - > Logic - > Dao。
public class Main {
public void a() {
List<Integer> res = new Logic().calculate(Arrays.asList(1, 2, 3, 4, 5));
}
}
public class Logic {
public List<Integer> calculate(List<Integer> ints) {
List<Integer> together = new Dao().getSomeInts();
together.addAll(ints);
return together;
}
}
public class Dao {
public List<Integer> getSomeInts() {
return Arrays.asList(1, 2, 3);
}
}
在我的情況,班主要和道是框架類(我不需要遷移它們)。類邏輯是商業邏輯,將從Scala很酷的功能中受益匪淺。
我需要重寫類邏輯 Scala中,同時保留與類主要和道完整性。最好重寫會是什麼樣子(不工作):
class Logic2 {
def calculate(ints: List[Integer]) : List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts()
together ++ ints
}
}
理想行爲:列表內Logic2是本地斯卡拉列出。全部進出java.util.Lists
自動獲得裝箱/取消裝箱。但這不起作用。
相反,這樣沒有問題(感謝scala-javautils(GitHub)):
import org.scala_tools.javautils.Implicits._
class Logic3 {
def calculate(ints: java.util.List[Integer]) : java.util.List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts().toScala
(together ++ ints.toScala).toJava
}
}
但它看起來醜陋。
我該如何實現Java和Java之間的列表和地圖的透明魔術轉換 - > Scala(不需要做toScala/toJava)?
如果不可能,遷移Java的最佳實踐是什麼 - >使用java.util.List
和朋友的Scala代碼是什麼?
非常好,+1 – geowa4 2009-10-05 15:33:31
(+1)非常好地陳述。我希望這篇文章已經出現,當我在一段時間後與之奮鬥時。 – Shaun 2009-10-05 15:46:57
感謝您的詳細報道。通過谷歌找到了(當然!)所以已經救了一個人很多的痛苦! – 2009-10-15 06:59:36