Ich bin relativ neu zu groovy und verwende es im Zusammenhang mit einem Gradle Build. Also seien Sie bitte nicht hart, wenn es eine einfache Out-of-the-Box-Lösung dafür gibt.Erstellen Sie eine verschachtelte Karte aus dem Schlüssel in groovy
Grundsätzlich versuche ich die umgekehrte Return Nested Key in Groovy zu erreichen. Das heißt, ich habe einige Schlüssel aus der System.properties
Karte zum Beispiel user.home
und entsprechenden Werten wie C:\User\dpr
gelesen. Jetzt möchte ich eine Karte erstellen, die diese Struktur reflektiert, es zu benutzen in einem groovy.text.SimpleTemplateEngine
als Bindungen:
[user : [home : 'C:\Users\dpr']]
Die Tasten können eine beliebige tiefe Hierarchie definieren. Zum Beispiel sollte java.vm.specification.vendor=Oracle Corporation
werden:
[java : [vm : [spec : [vendor : 'Oracle Corporation']]]]
Zusätzlich gibt es Eigenschaften mit den gleichen Eltern wie user.name=dpr
und user.country=US
:
[
user: [
name: 'dpr',
country: 'US'
]
]
bearbeiten: Während ConfigSlurper
wirklich schön ist, ist es etwas zu defensiv beim Erstellen der verschachtelten Karten, da die Verschachtelung bei der Mindesttiefe eines bestimmten Schlüssels beendet wird.
ich derzeit
def bindings = [:]
System.properties.sort().each {
def map = bindings
def split = it.key.split("\\.")
for (int i = 0; i < split.length; i++) {
def part = split[i];
// There is already a property value with the same parent
if (!(map instanceof Map)) {
println "Skipping property ${it.key}"
break;
}
if (!map.containsKey(part)) {
map[part] = [:]
}
if (i == split.length - 1) {
map[part] = it.value
} else {
map = map[part]
}
}
map = it.value
}
Mit dieser Lösung die Eigenschaften file.encoding.pkg
mit dieser endete, java.vendor.url
und java.vendor.url.bug
verworfen, die ich mit nicht schön, aber etwas ist fertig.
Allerdings ist der obige Code nicht sehr groovyish.
Dies ist zum Teil nur zu funktionieren scheint für einige Eigenschaften die richtige Struktur für andere nicht erstellt wird: '[java: [runtime.name:Java (TM) SE Runtime Environment , runtime.version: 1.8.0_92-b14, ... ' – dpr
Ich denke, dass dies mit der minimalen Tiefe eines bestimmten Eigenschaftspfades zusammenhängen kann. Es gibt 'java.home' und somit werden alle' java. * 'Einträge direkt unter dem' java' Schlüssel ohne weitere Verschachtelung erzeugt. – dpr
Ja, wenn a.b einen Wert hat, kann es nicht als Map implementiert werden und es kann keinen verschachtelten Wert haben. In diesem Fall erstellt der ConfigSlurper einen verschachtelten Wert mit einem Schlüssel mit einem. Innerhalb. Zum Beispiel 'java.vendor' ist ein String, also müssen Sie mit' java ['vendor.url'] 'auf den verschachtelten Wert zugreifen.' –