簡體   English   中英

將舊版Java代碼轉換為Scala功能慣用法

[英]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))

以我的經驗,將命令性代碼移植到功能上時,最好先進行常規清理,然后再進行明顯不安全和不正確的更改。

  • vars到vals
  • Option [T]可能會出現空值的任何地方
  • monadic map / foreach而不是if
  • for循環來映射/過濾
  • ArrayLists和Hashtables等到不可變的集合
  • 常規重命名和重構
  • 標記為密封/最終標記類型,以遷移到ADT
  • 使用隱式類將常用模式提取到Scala習語中,例如中綴操作

那么代碼將更加明顯,功能模式將出現並且易於實現,例如將可變類變為不可變類。 同樣,將有狀態循環重寫為map / filter / fold並非易事,必須特別注意細節,所有這些都必須以可讀的代碼庫開始。

例如,為避免“易碎”,您必須牢牢理解迭代的語義,然后再進行過濾/折疊。

另外,請始終記住使用重構工具,並在可能的情況下盡量避免“手動”更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM