2014-04-16 36 views
0

我正在寻找一些遗留的Java代码,现在它们必须转换为新的Scala系统。旧版代码如下所示。在新的Scala项目中,我将所有Java值对象作为案例类将您推荐将Java(OO风格和副作用)带入Scala(无副作用,变异等)的最佳方式是什么?将遗留Java代码转换为Scala函数式成语

编辑 collectFirst看起来适合Java break等效吗?

ln.collectFirst{case l if(availableSlot(allowedSection,vehicle,l)) >1 => vehicle.copy(allocatedSlot = Some(5), allocatedLane = Some(l))} 
+0

这里是一个程序,可以做Java到Scala的直接翻译:http://javatoscala.com/ 一旦你有了最终的Scala程序,你需要学习Scala以手动使代码习惯。 –

回答

1

所有情况下的类都配有copy方法,返回与选择场的情况下更新类的一个新副本:

vehicle.copy(allocation = 5, name = "new name") 

对于转换使用null使用Option,而不是代码。理想情况下,你应该重写一切使用Option,但作为一项临时措施,你可以换到,在Option返回null方法的调用:

val allowedSection: Section = Option(
    new Tools().getRequest(serviceEndpoint, vehicle.getStep(), serviceUser, servicePassword) 
).getOrElse(Section(name = vehicle.step)) 
+0

没错。案例类的复制方法是我在帖子中所说的“复制车辆案例类和设置分配”时的意思。 OO寻找变异的代码仍然是困扰。 – user2066049

+0

@ user2066049它没有太大的变化,因为先前的实例没有改动 –

1

以我的经验,移植势在必行代码的功能时,最好先做一个一般清理,然后才进行不明显安全和正确的更改。

  • 瓦尔到瓦尔斯
  • 选项[T]到处空值,就可能出现
  • 单子地图/的foreach代替如果是
  • for循环映射/过滤
  • 的ArrayList和哈希表等,以不可改变的集合
  • 一般重命名和重构
  • 标记类型密封/最终目标是迁移到ADT
  • 提取物共同模式到Scala中如使用中缀运算隐类

则代码将更加明显和功能模式中脱颖而出,很容易实现,如可变类以不可改变的那些成语这样。此外,重写映射/过滤/折叠的有状态循环并不重要,必须注意细节,所有这些都必须具备可读代码库。

例如避免“易碎”,必须牢牢了解迭代的语义你移动过滤/折前。

而且,一定要记住使用重构工具,并尝试从“手动”的变化,说走就走在可能的情况。

相关问题