什么是Groovy中的Inject方法?

Ant*_*t's 39 groovy

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

ata*_*lor 65

它将操作应用于集合并跟踪中间值.举个例子:[1, 2, 3, 4].inject(0, { sum, value -> sum + value }).这表示使用0作为初始值,并将加法运算应用于中间结果和每个元素的顺序.操作的每个应用程序都会生成一个新的中间结果.在这种情况下,闭包会将数字相加,因此它会生成列表的总和.你可以想象它像:

<initial value> <operation> <element1> <operation> ... <elementn>
Run Code Online (Sandbox Code Playgroud)

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

0 + 1 + 2 + 3 + 4
Run Code Online (Sandbox Code Playgroud)

要查找列表的产品,您可以使用[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!"]
Run Code Online (Sandbox Code Playgroud)

有时用于描述此操作的其他术语是"reduce",如MapReduce,或"fold"(特别是foldl).

  • 名称`inject`来自smalltalk,通过红宝石. (5认同)
  • 方法名称的一个非常奇怪的选择 - 我想知道为什么它没有被命名为reduce或fold? (4认同)