常规地图填充默认元素

时间:2019-06-20 10:18:59

标签: 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)){
                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]]

2 个答案:

答案 0 :(得分:3)

您可以简单地groupby

def mymap = mylist.groupBy { it % 2 == 0 ? 'even' : 'odd' }

这实际上是使用闭包在条件上对列表进行分区。

答案 1 :(得分:3)

您可以在地图上使用withDefault来自动为缺少的访问键生成一个值。

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