groovy映射使用默认元素填充

groovy映射使用默认元素填充,groovy,Groovy,是否有更为Groovish的方法向列表映射添加元素,并在不存在的情况下初始化默认列表 或者换句话说,用Groovish的方式编写以下代码: def mylist = [1,2,3,4] def mymap = [:] for (num in mylist){ if (num % 2 == 0){ pairity = "even" } else { pairity = "odd" } if (mymap.containsKey(pairity)){

是否有更为Groovish的方法向列表映射添加元素,并在不存在的情况下初始化默认列表

或者换句话说,用Groovish的方式编写以下代码:

def mylist = [1,2,3,4]
def mymap = [:]

for (num in mylist){
  if (num % 2 == 0){
    pairity = "even"
  } else {
    pairity = "odd"
  }


  if (mymap.containsKey(pairity)){
                println("Adding to Even")
                mymap[pairity].add(num)
  } 
  else {
                println("adding to Odd")
                mymap[pairity] = [num]
  }
}
print(mymap.toString())

// adding to Odd
// adding to Odd
// Adding to Even
// Adding to Even
// [odd:[1, 3], even:[2, 4]]
您可以简单地分组:

这就是有效地使用闭包根据条件对列表进行分区。

您可以简单地按以下方式分组:

这就是有效地使用闭包根据条件对列表进行分区。

您可以在地图上使用,以便在访问时自动为缺少的键生成值

[1,2,3,4].inject([:].withDefault{[]}){ m, i -> m[ i%2==0 ? 'odd' : 'even' ] << i; m }
// => [even:[1, 3], odd:[2, 4]]
您可以在地图上使用,以便在访问时自动为丢失的密钥生成值

[1,2,3,4].inject([:].withDefault{[]}){ m, i -> m[ i%2==0 ? 'odd' : 'even' ] << i; m }
// => [even:[1, 3], odd:[2, 4]]

谢谢@cfrick!我想这就是我一直在寻找的。你能详细说明一下其他部分吗?恐怕我在一行代码:[:]的行之间有点迷路了。默认情况下,{[]}将为您提供一个映射,该映射使用空列表的值填充缺少的键。withDefault接受一个闭包,并将使用该闭包的结果作为值。剩下的只是一个如何解决你的问题的例子,然而groupBy更适合解决你的问题谢谢!我同意,对于这个问题,分组比较好,但这个问题只是一个例子,可以帮助解决关于使用默认值填充的问题。因此,我会接受你的回答。谢谢@cfrick!我想这就是我一直在寻找的。你能详细说明一下其他部分吗?恐怕我在一行代码:[:]的行之间有点迷路了。默认情况下,{[]}将为您提供一个映射,该映射使用空列表的值填充缺少的键。withDefault接受一个闭包,并将使用该闭包的结果作为值。剩下的只是一个如何解决你的问题的例子,然而groupBy更适合解决你的问题谢谢!我同意,对于这个问题,分组比较好,但这个问题只是一个例子,可以帮助解决关于使用默认值填充的问题。因此,我会接受你的回答。谢谢!我已经解释了为什么在评论这个答案时会接受其他答案。谢谢!我已经解释了为什么在对这个答案的评论中会接受其他答案。