2015-04-27 6 views
3

Положительный пример: Может попасть в списокНепоследовательное разрушение/разложение Groovy в списках?

groovy> println GroovySystem.version 
groovy> final data1 = [[99,2] , [100,4]] 
groovy> data1.collect{x,y->x+y} 

2.2.1 
Result: [101, 104] 

Отрицательный пример: Не можете делать то же

groovy> println GroovySystem.version 
groovy> final data = [x:[99,2] , y:[100,4]] 
groovy> data.collect{key, val-> 
groovy> val.collect{x,y->x+y} 
groovy> }.flatten() 

2.2.1 
Exception thrown 

groovy.lang.MissingMethodException: No signature of method: ConsoleScript80$_run_closure1_closure2.doCall() is applicable for argument types: (java.lang.Integer) values: [99] 
Possible solutions: doCall(java.lang.Object, java.lang.Object), findAll(), findAll(), isCase(java.lang.Object), isCase(java.lang.Object) 
    at ConsoleScript80$_run_closure1.doCall(ConsoleScript80:5) 
    at ConsoleScript80.run(ConsoleScript80:4) 
+1

Во втором примере, когда collect вызывается в val, val является [99, 2]; замыкание будет вызвано первым, проходящим в 99, а затем снова проходящим в 2. Нет смысла иметь две переменные, переданные в замыкание, потому что в этот момент вызывается тот, который собирает список, - это список скалярных значений. Есть ли причина думать, что это должно работать? –

+0

Я не настаиваю на каких-либо аргументах, я просто хочу понять. , например. это работает final v = 1; v.collect {it + 1}; это тоже может работать, но нет final l = [1,2]; l.collect {x, y-> x + y}; –

ответ

1

Альтернатива

data.collect { key, val -> val.with { x, y -> x + y } } 
2

может быть, вы хотите

data.values().collect{x,y->x+y} 
+1

Ухаживать за разработкой? –

+1

Код OP повторяется над парами значений ключа 'data' Первая пара значений ключа:' x: [99,2] ' Затем итерация происходит на ** членах каждого значения **. Первым членом является '99' - но предоставленное закрытие принимает два параметра - и, таким образом, генерируется исключение. Если ОП хочет суммировать каждую пару чисел, я предлагаю повторить данные 'data', суммируя каждую пару, как показано выше. –

+3

Альтернативой является 'data.collect {key, val -> val.with {x, y -> x + y}}' –