2017-08-21 9 views
4

階層的なデータがあり、別のプロパティのマージされた値を取得したい場合、最もエレガントなもの、またはgroovyのように、同時に2つのプロパティを取得する最もエレガントな方法

次の例は、失敗したテストとスキップされたテストに関する情報を保持しています。もちろん、これらの値は分かれていますが、すべてのテストのリストを取得するユースケースでは、正常に実行されなかったため、私は2つの解決策を見つけました。

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

答えて

2

を試すことができます。

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

または

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

この1ライナーは非常に読みやすく、その意図をはっきりと示しています。 – Jazzschmidt

3

//Define the keys to find 
def requiredKeys = ['failedTests', 'skippedTests'] 
println requiredKeys.collect{ junitResultList.children."$it"}.flatten() 
ので、私はこの恐ろしい何とかアピールdisasterpieceを思い付い210

あなたはすぐにあなたがこのような何かにあなたの最初の式を簡素化することができ、同じオンラインdemo

+2

これは本当にスマートです! – Jazzschmidt

+0

@Jazzschmidt、あなたがそれを回答として受け入れることができれば感謝します。 – Rao

+0

upvoteをしましたが、いくつかの可能性をもっと見たいと思っています。ありがとう! – Jazzschmidt

2

あなたはsubMap() Sを得ることができますし、その上のvalues()は:

junitResultList*.children*.subMap(["failedTests","skippedTests"])*.values().flatten() 
関連する問題