2014-04-16 30 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中如使用中綴運算隱類

則代碼將更加明顯和功能模式中脫穎而出,很容易實現,如可變類以不可改變的那些成語這樣。此外,重寫映射/過濾/摺疊的有狀態循環並不重要,必須注意細節,所有這些都必須具備可讀代碼庫。

例如避免「易碎」,必須牢牢瞭解迭代的語義你移動過濾/折前。

而且,一定要記住使用重構工具,並嘗試從「手動」的變化,說走就走在可能的情況。

相關問題