Является ли Groovy .collect() эквивалентом JS .map()?

#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()