Java <-> Scala 互操作:透明的列表和映射转换
我正在学习Scala,我有一个Java项目要迁移到Scala。我想通过逐个重写类并检查新类是否破坏项目来迁移它。
这个 Java 项目使用了很多 和 。在新的Scala类中,我想使用Scala的,并拥有好看的Scala代码。java.util.List
java.util.Map
List
Map
问题在于,新类(在Scala中是wtitten的)不会与现有的Java代码无缝集成:Java需要,Scala需要自己的。java.util.List
scala.List
下面是该问题的简化示例。有类主,逻辑,道。他们用一行互相称呼:主->逻辑->道。
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);
}
}
在我的情况下,类Main和Dao是框架类(我不需要迁移它们)。类逻辑是业务逻辑,将从Scala的酷炫功能中受益匪浅。
我需要在 Scala 中重写类 Logic,同时保持 Main 和 Dao 类的完整性。最好的重写看起来像(不起作用):
class Logic2 {
def calculate(ints: List[Integer]) : List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts()
together ++ ints
}
}
理想行为:Logic2 中的列表是原生 Scala 列表。所有进/出自动装箱/拆箱。但这行不通。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<>Scala(无需执行toScala/toJava)之间实现列表和地图的透明魔术转换?
如果不可能,那么迁移Java->使用和朋友的Scala代码的最佳实践是什么?java.util.List