【问题标题】:Most elegant way to get two properties at the same time同时获取两个属性的最优雅方式
【发布时间】:2017-08-21 11:14:12
【问题描述】:

假设您有分层数据,并且想要获得单独属性的合并值,那么最优雅或 groovy 的方法是什么?

以下示例包含有关失败和跳过的测试的信息。当然,将这些值分开是有道理的——但是对于检索所有测试列表的用例,没有成功运行,我遇到了两种可能的解决方案,它们都不满足我的要求。

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

【问题讨论】:

    标签: groovy


    【解决方案1】:

    您可以将初始表达式简化为:

    junitResultList.children.collect { it.failedTests + it.skippedTests }.flatten()
    

    junitResultList.children.collect { [it.failedTests, it.skippedTests] }.flatten()
    

    【讨论】:

    • 这个单行字非常可读,清楚地表明了它的意图。
    【解决方案2】:

    你可以这样做:

    //Define the keys to find
    def requiredKeys = ['failedTests', 'skippedTests']
    println requiredKeys.collect{ junitResultList.children."$it"}.flatten()
    

    你可以在网上快速尝试一下demo

    【讨论】:

    • 这真是太聪明了!
    • @Jazzschmidt,如果你能接受它作为回答,如果回答有帮助,请投票赞成。
    • 投了赞成票,但希望看到更多可能性。谢谢!
    【解决方案3】:

    你可以得到subMap()s,然后是values()

    junitResultList*.children*.subMap(["failedTests","skippedTests"])*.values().flatten()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2018-09-03
      • 2010-10-30
      • 2017-07-05
      • 2013-04-23
      相关资源
      最近更新 更多