2016-05-14 19 views
2

我有一個對象Person,這個對象經歷了數百萬個獨特的轉換,並且這些轉換必須按順序完成。什麼是在Scala中執行數百萬個獨特轉換的功能方法?

傳統上,我可以這樣做:

var bob = new Person() 
birth(bob) 
oneYearOld(bob) 
middleSchool(bob) 
highSchool(bob) 
// ...million more transformations 

所以我的問題是,我怎麼能在Scala中做功能(無副作用/純函數)?如果我使用val bob,我是否會創建數百萬個可能導致內存問題的bob副本?

+0

「傳統」?一百萬行代碼?只是想知道,究竟是什麼傳統? 如果你正在談論純粹的功能轉換,你可能不需要其中的一百萬 - 因爲函數是穩定的,你應該能夠計算出最終結果,而不是所有的中間流失。如果它不是純粹的功能,那麼......好吧,常識會佔上風。順便說一句,你寫的方式,'bob'是'var'還是'val'並不重要。你知道嗎? – Dima

回答

5

您可以使用function composition

i(h(g(f(bob)))) 

一種方式做,這將是所有變革的拖放到一個序列(或緩衝器或表或..),然後再應用

val finalBob = functionsSeq.foldleft(bob) { case (xformBob, fn) => fn(xformBob) } 

功能組合是爲了清晰表達和優雅。每個轉換都將涉及從(不可變的)現有轉換生成一個新實例:這是純函數編程的主要目標。

fp方法不會節省內存消耗/對象生成。但是 - 正如評論者所指出的那樣 - 這些對象堆積如山,壽命短,並且易於被垃圾收集器管理/使用。

+0

謝謝,那麼我的下一個問題就是內存,大概每個方法的簽名都會返回一個'Person''。如果我將所有轉換放入Seq中,是否意味着在整個轉換中只會創建一個對象? – LuckyGuess

+0

我給OP增加了一些評論:看看。 – javadba

+0

感謝您的幫助! :) – LuckyGuess

相關問題