Применяет операцию к коллекции и отслеживает промежуточное значение. Возьмите этот пример: [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 ).