#groovy
#groovy
Вопрос:
ОТРЕДАКТИРОВАННЫЙ ВОПРОС:
def responseTemp = []
def response = [:]
loop1.each { row1 ->
loop2.each (row2 ->
loop3.each {row3 ->
loop4.each {row4 ->
response << ['field1' : 'row1.value1']
response << ['field2' : 'row2.value1']
response << ['field3' : 'row3.value1']
responseTemp.add(response)
}
}
}
}
println (responseTemp)
Ожидаемый результат — я должен получить весь ответ (мой выполняется 10 раз), поэтому должен увидеть все 10 ответов в responseTemp. Но что я вижу, если только 10-й ответ 10 раз в responseTemp.
Как я могу добавить весь ответ в responseTemp по мере выполнения итерации и вернуть его в конце.
Комментарии:
1. Почему вы повторно используете имена своих списков в качестве переменных закрытия? Кроме того,
response << ['key' : "value"]
в итоге будет только одно значениеresponse
, даже если вы запустите его миллион раз.2. Я в основном пытаюсь сохранить весь ответ в списке и передать его позже, как только цикл будет завершен
3. Но при попытке сделать это все, что я вижу, это только последний ответ, повторяющий no . раз, когда цикл выполнялся
4. @ernest_k: Есть ли способ сохранить все эти ответы в другой список, чтобы я не терял их во время цикла? И которое я могу использовать после завершения цикла
5. Вы, скорее всего, теряете их, потому что добавляете их в одну и ту же map (
response
) снова и снова — и все же совершенно непонятно, что вам нужно — этот пример кода настолько абстрагирован от реальной проблемы, что его трудно понять (по крайней мере, для меня). Не могли бы вы, пожалуйста, предоставить минимальный жизнеспособный пример (определите list [123] с несколькими фиктивными значениями, не добавляйте всегда одно и то же[key: "value"]
на карту, а что-то реальное, и, наконец, укажите, какой результат вы ожидаете получить от входных данных.
Ответ №1:
Поскольку вы удерживаете свою карту, чтобы добавить к результатам по всем элементам вашего декартова произведения, вы всегда будете добавлять одну и ту же карту к результату. И поскольку вы переопределяете всегда одни и те же ключи, карта будет содержать элементы последней итерации.
Простое решение: переместите def response
в самое внутреннее each/ closure.
Тем не менее, вы также можете просто вообще не использовать переменную и вместо нее использовать литерал карты. Например.
def responseTemp = []
[1,2].each{ row1 ->
[3,4].each{ row2 ->
responseTemp.add([field1: row1, field2: row2])
}
}
println (responseTemp)
// → [[field1:1, field2:3], [field1:1, field2:4], [field1:2, field2:3], [field1:2, field2:4]]
Если вы предпочитаете более декларативный способ, вы также можете использовать collectMany
во
внешних циклах и, наконец collect
, во внутренних. Например.
def responseTemp = [1,2].collectMany{ row1 ->
[3,4].collectMany{ row2 ->
[5,6].collect{ row3 ->
[field1: row1, field2: row2, field3: row3]
}
}
}
println (responseTemp)
// → [[field1:1, field2:3, field3:5], [field1:1, field2:3, field3:6], [field1:1, field2:4, field3:5], [field1:1, field2:4, field3:6], [field1:2, field2:3, field3:5], [field1:2, field2:3, field3:6], [field1:2, field2:4, field3:5], [field1:2, field2:4, field3:6]]
Комментарии:
1. Это сработало как шарм. Большое спасибо @cfrick