假设您有分层数据并希望获得单独属性的合并值,那么最优雅或 groovy 的方法是什么?
以下示例包含有关失败和跳过测试的信息。当然,确实有意义的是,这些值是分开的 - 但是对于检索所有测试列表的用例,这些测试没有成功运行,我遇到了两个可能的解决方案,他们都不满足我。 / p>
def junitResultList = [
[
name: "Testsuite A",
children: [
failedTests: ["Test 1", "Test 2"],
skippedTests: []
]
],
[
name: "Testsuite B",
children: [
failedTests: ["CursorTest"],
skippedTests: ["ClickTest", "DragNDropTest"]
]
]
]
更具体地说,我希望值为["Test 1", "Test 2", "CursorTest", "ClickTest", "DragNDropTest"]
。
第一种方法只是执行扩展测试列表的添加:
(junitResultList*.children*.failedTests +
junitResultList*.children*.skippedTests).flatten()
虽然这有效,但在我看来,两次指定这些属性的路径似乎并不是最常规的方式,所以我想出了这个可怕的,但不知何故吸引人的灾难:
(junitResultList*.children*.findAll {
['skippedTests', 'failedTests'].contains(it.key)
})*.values().flatten()
答案 0 :(得分:3)
您可以执行以下操作:
//Define the keys to find
def requiredKeys = ['failedTests', 'skippedTests']
println requiredKeys.collect{ junitResultList.children."$it"}.flatten()
您可以在线快速尝试 demo
答案 1 :(得分:2)
您可以将初始表达式简化为以下内容:
junitResultList.children.collect { it.failedTests + it.skippedTests }.flatten()
或
junitResultList.children.collect { [it.failedTests, it.skippedTests] }.flatten()
答案 2 :(得分:2)
您可以获取subMap()
,然后点击values()
:
junitResultList*.children*.subMap(["failedTests","skippedTests"])*.values().flatten()