最优雅的方式同时获得两个属性

时间:2017-08-21 11:14:13

标签: groovy

假设您有分层数据并希望获得单独属性的合并值,那么最优雅或 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()

3 个答案:

答案 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()