Ответ 1
Прошло некоторое время с тех пор, как я играл с этим, но лучший способ перебирать карты (и другие контейнеры) был с "классическим" для циклов или "для". См. Ошибка: неправильное использование двоичных методов, принимающих закрытие
К вашей конкретной проблеме большинство (все?) конвейерных DSL-команд добавят точку последовательности, и я имею в виду ее возможность сохранить состояние конвейера и возобновить его позднее. Например, подумайте о ожидании ввода пользователя, вы хотите сохранить это состояние даже через перезапуск. В результате каждый живой экземпляр должен быть сериализован, но стандартный итератор карты, к сожалению, не сериализуем. Оригинальная тема
Лучшее решение, которое я могу придумать, - это определение функции для преобразования Карты в список сериализуемых MapEntries. Функция не использует никаких шагов конвейера, поэтому в ней нет необходимости сериализовать.
@NonCPS
def mapToList(depmap) {
def dlist = []
for (def entry2 in depmap) {
dlist.add(new java.util.AbstractMap.SimpleImmutableEntry(entry2.key, entry2.value))
}
dlist
}
Это должно быть очевидно вызвано для каждой карты, которую вы хотите перебрать, но вверху, чтобы тело цикла оставалось прежним.
for (def e in mapToList(map))
{
println "key = ${e.key}, value = ${e.value}"
}
Вам нужно будет одобрить конструктор SimpleImmutableEntry
в первый раз, или, вполне возможно, вы сможете обойти это, поместив функцию mapToList в библиотеку рабочих процессов.