Создать карту с CollectEntries в Groovy - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть следующий список: appList = [DevOpsApplication, 01.01.01]

Я хотел бы создать карту, используя collectEntries. Я знаю, что it относится к текущему элементу итерации (ярлык для { it -> it }). Поэтому я попытался использовать индекс:

def appMap = appList.collectEntries { [(it[0]):it[1]] }  

Однако, это дает мне:

[D:e, 0:1]

Но я хочу [DevOpsApplication: 01.01.01]. Есть ли способ сделать это?

Кроме того, в будущем я хотел бы расширить это до более чем 2 элементов (например, [DevOpsApplication, 01.01.01, AnotherDevOpsApplication, 02.02.02]) с желаемым выходным значением [DevOpsApplication: 01.01.01, AnotherDevOpsApplication: 02.02.02]. Как это будет возможно?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Очень короткая версия для этого:

def appList = ["DevOpsApplication", "01.01.01"]
def appMap = [appList].collectEntries() // XXX
assert appMap == [DevOpsApplication: "01.01.01"]

Как это работает: функция collectEntries принимает, как ожидается, возврат карты или списка из двух элементов.Ваш appList это уже так.Поэтому поместите это в другой список, назовите collectEntries.Когда функция collectEntries не назначена, она использует функцию идентификации.

Бонус: что, если appList имеет гораздо больше элементов?Вы можете использовать collate для создания кортежей.

def appList = ["DevOpsApplication", "01.01.01", "Some", "More"]
def appMap = appList.collate(2).collectEntries() // XXX
assert appMap == [DevOpsApplication: "01.01.01", Some: "More"]
2 голосов
/ 29 апреля 2019

Вы перебираете элемент за элементом и (поскольку ваши элементы String -типированы) отображают 0 подстроки на 1 подстроки.

Вы можете использовать это для пропуска одного элемента вкаждой итерации и сопоставьте каждый элемент по четным индексам с одним после него:

def appList = ['DevOpsApplication', '01.01.01']
def appMap = (0..(appList.size()-1)).findAll{0 == it%2}
    .collectEntries{[(appList[it]): appList[it+1]]}

Возвращает [DevOpsApplication:01.01.01], как и ожидалось.

1 голос
/ 29 апреля 2019

Я также нашел другой метод.Groovy может преобразовать значения массива объектов и преобразовать их в карту с toSpreadMap().Однако в массиве должно быть четное количество элементов.

def appList = ['DevOpsApplication', '01.01.01']
def appMap = appList.toSpreadMap()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...