Ту зе пауер оф Груви! Объединяем два List в Map

Ту зе пауер оф Груви!
Объединяем два List в один Map

Занимаюсь разбором CSV. Там, где в первой строке - названия полей, а в последующих - значения. По ряду причин удобнее работать не с List, а с Map, где ключи - это значения из первой строчки. Соответственно встал вопрос, как бы это половчее сделать. В Groovy нет нативного красивого метода, но нашлось в интернетах прикольное:

Map l = [names,line].transpose().inject([:]) { a, b -> a[b[0]] = b[1]; a }

 

Где names - это список ключей, а line - это список значений.

Решение из разряда регулярных выражений. Когда ничерта не ясно, что тут должно быть. Но если приглядеться, то

1. берется список из списков входных значений и с ними делается transpose, то есть, из исходного списка

[[a,b,c],[1,2,3]] делается список [[a,1],[b,2],[c,3]]

2. далее выполняется inject. То есть, к элементам списка поочередно применяется некий код, а полученный результат вставляется в результирующее значение. В данном случае, inject принимает два аргумента - это значение в скобках - начальное значение результата - [:], по простому это new HashMap(); второй аргумент - это Closure, что прицеплена сзади. Там и происходит наполнение результата значениями.

Как-то так.

Комментарии (0)

mem: 1150 total: 27 module: 15 xsl: 9