web-dev-qa-db-fra.com

Carte avec clé en tant que chaîne et valeur en tant que liste dans Groovy

Quelqu'un peut-il m'indiquer comment utiliser une variable Map dans Groovy ayant pour clé String et pour valeur List?

27
Sripaul

Groovy accepte presque toute la syntaxe Java. Il existe donc un éventail de choix, comme illustré ci-dessous:

// Java syntax 

Map<String,List> map1  = new HashMap<>();
List list1 = new ArrayList();
list1.add("hello");
map1.put("abc", list1); 
assert map1.get("abc") == list1;

// slightly less Java-esque

def map2  = new HashMap<String,List>()
def list2 = new ArrayList()
list2.add("hello")
map2.put("abc", list2)
assert map2.get("abc") == list2

// typical Groovy

def map3  = [:]
def list3 = []
list3 << "hello"
map3.'abc'= list3
assert map3.'abc' == list3
37
Michael Easter
def map = [:]
map["stringKey"] = [1, 2, 3, 4]
map["anotherKey"] = [55, 66, 77]

assert map["anotherKey"] == [55, 66, 77] 
16
AA.

Un autre petit élément utile pour traiter les cartes/listes car la valeur d'une carte est la méthode withDefault(Closure) sur les cartes dans groovy. Au lieu de faire le code suivant:

Map m = [:]
for(object in listOfObjects)
{
  if(m.containsKey(object.myKey))
  {
    m.get(object.myKey).add(object.myValue)
  }
  else
  {
    m.put(object.myKey, [object.myValue]
  }
}

Vous pouvez faire ce qui suit:

Map m = [:].withDefault{key -> return []}
for(object in listOfObjects)
{
  List valueList = m.get(object.myKey)
  m.put(object.myKey, valueList)
}

Avec default peut aussi être utilisé pour d’autres tâches, mais j’en trouve le cas d’utilisation le plus courant.

API: http://www.groovy-lang.org/gdk.html

Carte -> avec défaut (fermeture)

8
Joseph

vous n'avez pas besoin de déclarer que Map groovy le reconnaît en interne 

def personDetails = [firstName:'John', lastName:'Doe', fullName:'John Doe']

// print the values..
    println "First Name: ${personDetails.firstName}"
    println "Last Name: ${personDetails.lastName}"

http://grails.asia/groovy-map-tutorial

5

Joseph a oublié d'ajouter la valeur dans son exemple avec withDefault. Voici le code que j'ai finalement utilisé:

Map map = [:].withDefault { key -> return [] }
listOfObjects.each { map.get(it.myKey).add(it.myValue) }
1
Johan Frick