2011-03-06 46 views

回答

58

它將操作應用於集合並跟蹤中間值。以此示例爲例:[1, 2, 3, 4].inject(0, { sum, value -> sum + value })。這表示使用0作爲初始值,並將添加操作按順序應用於中間結果和每個元素。該操作的每個應用程序都會生成新的中間結果。在這種情況下,閉包將數字相加,因此它會生成列表的總和。你可以把它想象這樣的:

<initial value> <operation> <element1> <operation> ... <elementn> 

或者,在[1, 2, 3, 4].inject(0, { sum, value -> sum + value })的情況:

0 + 1 + 2 + 3 + 4 

爲了找到一個列表的產品,你可以使用[1, 2, 3, 4].inject(1, { product, value -> product * value})。在這種情況下,1被用作初始值,因爲它是多重複制的標識值。

下面是分割多字字符串列表成詞的平面列表的示例:其有時用於描述這種操作是「減少」

strings = ["", "this", "is a", "test of inject!"] 
words = strings.inject([], { list, value -> list + value.tokenize() }) 
assert words == ["this", "is", "a", "test", "of", "inject!"] 

其他術語,如在MapReduce,或一個「摺疊」(特別是一個foldl)。

+0

你可以說在這個例子中,標記化是做什麼的? – 2011-03-06 07:52:17

+0

Tokenize只是將空白字符串分開。它與String.split相同,除了它返回一個列表而不是一個數組。 – ataylor 2011-03-06 20:36:59

+3

方法名稱的一個非常奇怪的選擇 - 我想知道爲什麼它沒有被命名爲reduce或fold? – 2014-09-17 15:59:09

相關問題