所以,這取決於你認爲什麼是更多的功能,但這裏有一個版本,不帶「變種」
def myProcessorFunctional(items: List[Int]) {
def myProcessorHelper(items: List[Int], numProcessed: Int) {
if (numProcessed < items.size) {
val processedSoFar = items.size - numProcessed
myProcessorHelper(items,
numProcessed + processNextBlockOfItems(items, processedSoFar))
}
}
myProcessorHelper(items, 0)
}
(使它INTS的名單只是爲了簡單起見,將容易使它使用一個通用的列表)
我不得不說它是我不介意可變變量的那些情況之一 - 很明顯,沒有引用它可以逃避方法。
但正如我在上面的評論中所說的,無論如何,processNextBlockOfItems本質上是非功能性的,因爲它被稱爲副作用。一個更有效的方式是讓它返回到目前爲止的處理狀態,並且這個狀態將在隨後的調用中更新(並返回)。現在,如果你在處理兩個不同的項目名單中間,你就必須processNextBlockOfItems內維護兩個不同的部分處理的狀態的問題...
後來:
仍然忽略狀態問題,如果processNextBlockOfItems總是處理傳遞給它的項目列表的第一個塊,則返回其未處理的剩餘項目(如果使用List,這很方便和高效,所以我想知道爲什麼你會「重新使用指示)。
這會產生這樣的:
def myProcessorMoreFunctional(items: List[Int]) {
if (!items.isEmpty) {
myProcessorMoreFunctional(processNextBlockOfItems(items))
}
}
'高清myProcessor(VAL項目:名單){myProcessor(項目,items.size())}';並將當前方法更改爲具有應處理的當前項目數量「int」的額外參數,而不是在一段時間內調用,而是遞歸調用。在你看來,這種功能足夠嗎? – amit
@amit所以它會永遠運行? –
@HunterMcMillen當然不是,當numProcessed <0 – amit