#javascript #groovy
#javascript #groovy
Вопрос:
Является ли Groovy .collect() эквивалентом JS .map()? Или есть другая цель?
Комментарии:
1. Я написал в общей сложности дюжину строк Groovy, и я даже никогда не видел
.collect
, но кажется, что это эквивалентно. Мне потребовался краткий поиск в Google, чтобы найти это. У вас есть основания полагать, что они не эквивалентны? Потому что в противном случае это не кажется очень хорошим вопросом.2. название сбивало с толку. Первой моей мыслью было «может быть, это не совсем эквивалентно»… Спасибо за разъяснение.
Ответ №1:
Он также может выполнять несколько других действий (например, начальный сбор), но в остальном это почти то же самое:
// Collect without
// initial collection.
assert [1,2,8] == [1,4,64].collect(Math.amp;sqrt)
assert [0,2,4,6] == (0..3).collect { it * 2 }
assert ['Groovy', 'Grails'] == [lang: 'Groovy', framework: 'Grails'].collect { it.value }
// Collect with initial collection argument.
assert [0, 1, 2, 3] == [2, 3].collect([0, 1]) { it }
assert [0, 3, 6, 9] == [2, 3].collect([0, 3], { it * 3})
assert ['Gradle', 'groovy', 'grails'] == ['Groovy', 'Grails'].collect(['Gradle']) { it.toLowerCase() }
assert ['m','r','h','a','k','i'] == [4, -3, 7, 5].collect(['m', 'r']) { (it 100) as char }
PS. спасибо за примеры в превосходном блоге mrhaki Groovy Goodness
Комментарии:
1. Спасибо за объяснение! Так что они разные.
2. Он просто
collect
может перебирать гораздо больше вещей (карты, строки, другие объекты, коллекции), в то времяmap
как в JavaScript работает только с массивами. При работе с массивами, списками или другими «коллекциями» в groovy его функциональность аналогична в остальном.3. Также:
[a:'1', b:'2'].collect { k, v -> "$k$v" }
Ответ №2:
да, collect()
позволяет преобразовать тип или структуру элемента коллекции:
def strings = [ '1', '2', '3' ]
assert String == strings.first().getClass()
def nums = strings.collect{ it as Integer }
assert Integer == nums.first().getClass()