什么是Groovy中的Inject方法?

时间:2011-03-06 06:46:48

标签: groovy

Groovy中的inject方法实际上做了什么?我用谷歌搜索,并没有找到确切的答案。任何人都可以用一个简单的例子来指定它的用途吗?

1 个答案:

答案 0 :(得分:61)

它将操作应用于集合并跟踪中间值。举个例子:[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)。