[英]Convert legacy Java code into Scala functional idioms
我正在查看一些遺留Java代碼,現在必須將其轉換為新的Scala系統。 舊版代碼如下所示。 在新的Scala項目中,我將所有Java值對象都作為case類。您建議將這種Java(OO樣式和副作用)帶到Scala(沒有副作用,突變等)的最佳方法是什么?
編輯 collectFirst看起來是否適合Java中斷等效項?
ln.collectFirst{case l if(availableSlot(allowedSection,vehicle,l)) >1 => vehicle.copy(allocatedSlot = Some(5), allocatedLane = Some(l))}
所有案例類都帶有一個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))
以我的經驗,將命令性代碼移植到功能上時,最好先進行常規清理,然后再進行明顯不安全和不正確的更改。
那么代碼將更加明顯,功能模式將出現並且易於實現,例如將可變類變為不可變類。 同樣,將有狀態循環重寫為map / filter / fold並非易事,必須特別注意細節,所有這些都必須以可讀的代碼庫開始。
例如,為避免“易碎”,您必須牢牢理解迭代的語義,然后再進行過濾/折疊。
另外,請始終記住使用重構工具,並在可能的情況下盡量避免“手動”更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.