是否有一个Groovy等同于Ruby的#map?

时间:2014-06-27 16:10:31

标签: list collections map groovy

我意识到支持#each

  Book.findAll().each(){ book->
    println ">>> ${book}"
  }

甚至还有support for #inject

  def sentence = m.inject('Message: ') { s, k, v ->
    s += "${k == 'likes' ? 'loves' : k} $v "
  }

是否支持开箱即用的Groovy #map(没有像Functional Java这样的特殊库)?

  def list = [1,2,3,4].map{ num->
    num + 1
  }

  assert list == [2,3,4,5]

2 个答案:

答案 0 :(得分:10)

您想要collect

groovy:000> [1,2,3,4].collect { num -> num + 1 }
===> [2, 3, 4, 5]

我希望有所帮助。

答案 1 :(得分:2)

您可以使用收集,如

[1, 2, 3, 4].collect { it + 1 }

对于直接在集合中的每个对象上调用方法的情况,使用spread-dot运算符的语法较短:

[1, 2, 3, 4]*.plus 1 

(使用Groovy添加到java.lang.Integer的方法来实现+运算符)

即使列表包含空值,此运算符仍然有效:

groovy:000> [1, 2, 3, null, 4]*.plus 1
===> [2, 3, 4, null, 5]

在哪里收集你必须检查:

[1, 2, 3, null, 4].collect { it?.plus 1 }