Что делает метод inject
в Groovy? Я искал его и не нашел точного ответа. Может ли кто-нибудь указать его использование с простым примером?
Что такое метод Inject в Groovy?
Ответ 1
Он применяет операцию к коллекции и отслеживает промежуточное значение. Возьмите этот пример: [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, поскольку оно является идентификационным значением для mulitplication.
Здесь пример, который разбивает список многословных строк на плоский список слов:
strings = ["", "this", "is a", "test of inject!"]
words = strings.inject([], { list, value -> list + value.tokenize() })
assert words == ["this", "is", "a", "test", "of", "inject!"]
Другие термины, которые иногда используются для описания этой операции, "уменьшаются", как в MapReduce, или "fold" (в частности a foldl).