2011-03-06 93 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

相关问题