Groovy карта заполнить с элементом по умолчанию - PullRequest
1 голос
/ 20 июня 2019

Есть ли более 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 ]

3 голосов
/ 20 июня 2019

Вы можете использовать withDefault на карте, чтобы автоматически генерировать значение для отсутствующего ключа при доступе.

[1,2,3,4].inject([:].withDefault{[]}){ m, i -> m[ i%2==0 ? 'odd' : 'even' ] << i; m }
// => [even:[1, 3], odd:[2, 4]]
3 голосов
/ 20 июня 2019

Вы можете просто groupby:

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

То есть эффективно использует замыкание для разбиения списка по условию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...