У меня есть структура вложенной карты:
Map<String, List<String>> case_pool = [
dev : [
funcA : ['devCaseA'] ,
funcB : ['devCaseB'] ,
funcC : ['devCaseC']
],
'dev/funcA' : [
funcA : ['performanceCaseA']
],
'dev/funcA/feature' : [
funcA : ['performanceCaseA', 'featureCase']
],
staging : [
funcB : ['stgCaseB'] ,
funcC : ['stgCaseC']
]
]
и я хочу получить результат, когда branch.contains(case_pool.key)
, затем объедините список случаев. т.е.:
String branch = 'dev/funcA/feature-1.0'
// will final get result of " 'dev' + 'dev/funcA' + 'dev/funcA/feature' ":
result:
[
funcA: [ "devCaseA", "performanceCaseA", "featureCase" ],
funcB: [ "devCaseB" ],
funcC: [ "devCaseC" ]
]
Сначала я использую l oop:
String branch = 'dev/funcA/feature-1.0'
def result = [:].withDefault { [] as Set }
case_pool.keySet().each {
if ( branch.contains(it) ) {
case_pool.get(it).each { k, v ->
result[k].addAll(v)
}
}
}
println 'result: ' + result
Во-вторых, я использую закрытие:
String branch = 'dev/funcA/feature-1.0'
def result = [:].withDefault { [] as Set }
case_pool.findAll{ k, v -> branch.contains(k) }.collectMany{ k, v -> v.collect{ c, l ->
result[c].addAll(l)
}}
println 'result: ' + result
Однако , Мне не нравится путь .collectMany{ k, v -> v.collect{ c, l -> }}
. Есть ли лучшие решения? (например: используя groupBy
или что-то в этом роде)
Кстати, я пробовал collectEntries
, и оказалось, что окончательный список заменит все:
String branch = 'dev/funcA/feature-1.0'
println case_pool.findAll{ k, v -> branch.contains(k) }.collect{ k, v -> v}.collectEntries{it}
result: [funcA:[performanceCaseA, featureCase], funcB:[devCaseB], funcC:[devCaseC]]
последний funcA : ['performanceCaseA', 'featureCase']
заменил все funcA: []