将旧Java代码转换为Scala功能惯用法

时间:2014-04-16 14:52:16

标签: scala

我正在研究一些遗留的Java代码,现在必须将其转换为新的Scala系统。旧版代码如下所示。在新的Scala项目中,我将所有Java值对象作为案例类建议将Java(OO样式和副作用)引入Scala(没有副作用,突变等)的最佳方法是什么?

修改 collectFirst是否适合Java break等效?

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

2 个答案:

答案 0 :(得分:1)

所有案例类都附带copy方法,该方法返回案例类的新副本,并更新了选择字段:

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

要转换使用null的代码,请改用Option。理想情况下,您应该重写所有内容以使用Option,但作为临时措施,您可以包含对null中返回Option的方法的调用:

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

答案 1 :(得分:1)

根据我的经验,在将命令式代码移植到功能时,最好首先进行一般清理,然后才进行明显不安全和正确的更改。

  • vars to vals
  • 选项[T]到处都可以出现空值
  • monadic map / foreach而不是if'
  • for loops to map / filter
  • ArrayLists和Hashtables等到不可变集合
  • 一般重命名和重构
  • 标记类型已密封/最终,目标是迁移到ADT
  • 将常见模式提取到Scala习语中,例如使用隐式类的中缀操作

然后代码将更加明显,并且功能模式将出现并且易于实现,例如可变类到不可变类。此外,重写有状态循环以映射/过滤/折叠是非常重要的,必须注意细节,所有这些都需要一个可读的代码库来开始。

例如,为了避免“易碎”,您必须在移动到过滤/折叠之前牢固地理解迭代的语义。

此外,请始终记住使用重构工具并尽量远离"手册"在可能的情况下改变。