我正在研究一些遗留的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))}
答案 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)
根据我的经验,在将命令式代码移植到功能时,最好首先进行一般清理,然后才进行明显不安全和正确的更改。
然后代码将更加明显,并且功能模式将出现并且易于实现,例如可变类到不可变类。此外,重写有状态循环以映射/过滤/折叠是非常重要的,必须注意细节,所有这些都需要一个可读的代码库来开始。
例如,为了避免“易碎”,您必须在移动到过滤/折叠之前牢固地理解迭代的语义。
此外,请始终记住使用重构工具并尽量远离"手册"在可能的情况下改变。