我想要合并配置文件:
tool:
jdk:
- name: jdk8
version: 8
- name: jdk11
version: 11带档案:
tool:
jdk:
- name: jdk11
version: 11
- name: jdk15
version: 15因此,我期望:
tool:
jdk:
- name: jdk8
version: 8
- name: jdk11
version: 11
- name: jdk15
version: 15没有副本。Am目前正在使用@stepniak:https://e.printstacktrace.blog/how-to-merge-two-maps-in-groovy/#merge-maps-with-nested-maps的解决方案。
你知道我怎么才能避免重复吗?
非常感谢
发布于 2021-03-05 10:10:09
以下代码:
import groovy.yaml.*
def dataA = '''\
tool:
jdk:
- name: jdk8
version: 8
- name: jdk11
version: 11
'''
def dataB = '''\
tool:
jdk:
- name: jdk11
version: 11
- name: jdk15
version: 15
'''
def parser = new YamlSlurper()
def a = parser.parseText(dataA)
def b = parser.parseText(dataB)
def c = [tool: [jdk: (a.tool.jdk + b.tool.jdk).unique()]]
println "a: $a"
println "b: $b"
println "c: $c"
def builder = new YamlBuilder()
builder c
println(builder)当运行时,结果是:
─➤ groovy solution.groovy
a: [tool:[jdk:[[name:jdk8, version:8], [name:jdk11, version:11]]]]
b: [tool:[jdk:[[name:jdk11, version:11], [name:jdk15, version:15]]]]
c: [tool:[jdk:[[name:jdk8, version:8], [name:jdk11, version:11], [name:jdk15, version:15]]]]
---
tool:
jdk:
- name: "jdk8"
version: 8
- name: "jdk11"
version: 11
- name: "jdk15"
version: 15这个解决方案并不是很通用的,因为我们硬编码x.tool.jdk路径。另一种方法是编写某种递归合并函数,它可以以更通用的方式完成。
注释后的更新:
对于评论中的问题,您可以这样做:
def a = [tool: [jdk: [installations:
[[name: 'latest-11',
properties: [[installSource: [installers:[[zip:[subdir:'jdk-11.999', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]]]]]]
def b = [tool: [jdk: [installations:
[[name: 'latest-11', properties: [[installSource:[installers:[[zip:[subdir:'jdk-11.37', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]],
[name: 'jdk-11.0.3', properties: [[installSource:[installers:[[zip:[subdir:'jdk-11.3', url:'https://artifactory/OpenJDK11U_11.0.3_7.tar.gz']]]]]]]]]]]
def uniqueInstallations = (a.tool.jdk.installations + b.tool.jdk.installations).toUnique { x, y -> x.name <=> y.name }
def c = [tool: [jdk: [installations: uniqueInstallations]]]
uniqueInstallations.each {
println it
}
println "=="
println c其中的指纹:
➤ groovy solution2.groovy
[name:latest-11, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.999, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]
[name:jdk-11.0.3, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.3, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]
==
[tool:[jdk:[installations:[[name:latest-11, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.999, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]], [name:jdk-11.0.3, properties:[[installSource:[installers:[[zip:[subdir:jdk-11.3, url:https://artifactory/OpenJDK11U_11.0.3_7.tar.gz]]]]]]]]]]]https://stackoverflow.com/questions/66479924
复制相似问题