我正在学习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