2017-02-26 3 views
1

Je suis nouveau à Groovy et travaille sur un gestionnaire de périphérique pour mon Hub Smartthing qui est écrit en Groovy. J'ai du mal à analyser une chaîne.Injecter la chaîne à la carte - Groovy

def parseDescriptionAsMap(description) { 
    println "description: '${description}" 
    def test = description.split(",") 
    println "test: '${test}" 
    test.inject([:]) { map, param -> 
     def nameAndValue = param.split(":") 
     println "nameAndValue: ${nameAndValue}" 
     if(map) 
     { 
      println "map is NOT NULL" 
      map.put(nameAndValue[0].trim(),nameAndValue[1].trim()) 
     } 
     else 
     { 
      println "map is NULL!" 
     } 
    } 
} 

sortie:

description: 'index:17, mac:AAA, ip:BBB, port:0058, requestId:ce6598b2-fe8b-463d-bdf3-01ec35055f7a, tempImageKey:ba416127-14e3-4c7b-8f1f-5b4d633102e5 
test: '[index:17, mac:AAA, ip:BBB, port:0058, requestId:ce6598b2-fe8b-463d-bdf3-01ec35055f7a, tempImageKey:ba416127-14e3-4c7b-8f1f-5b4d633102e5] 
nameAndValue: [index, 17] 
nameAndValue: [ mac, AAA] 
map is NULL! 
nameAndValue: [ ip, BBB] 
map is NULL! 
map is NULL! 
nameAndValue: [ port, 0058] 
nameAndValue: [ requestId, ce6598b2-fe8b-463d-bdf3-01ec35055f7a] 

Deux questions: 1. Pourquoi
est la variable, carte, null?
2. Pourquoi la fonction n'imprime pas l'information nameAndValue -> 'tempImageKey' info?

Répondre

2
  1. carte ne peut pas être nulle, if(map) vérifie s'il est nul ou vide ... et il ne sera pas nul dans cette situation (tant que vous suivez # 2)
  2. Vous devez retourner map de la inject fermeture, de sorte que peut être agrégé.

    test.inject([:]) { map, param -> 
        def nameAndValue = param.split(":") 
        println "nameAndValue: ${nameAndValue}" 
        map.put(nameAndValue[0].trim(),nameAndValue[1].trim()) 
        map 
    } 
    

Une version plus simple de ce que vous essayez serait:

description.split(',')*.trim()*.tokenize(':').collectEntries()