有条件地取出Groovy Closure上的元素

时间:2015-09-30 05:03:25

标签: groovy

我正在使用Groovy库调用ws-lite进行Web服务测试。它的工作方式是关闭并生成XML并将其发送到Web服务端点。

请参阅下文,了解此闭包的简单示例:

def bookXml = {
    books {
        book(available: "20", id: "1") {
            title("Don Xijote")
            author(id: "1", "Manuel De Cervantes")
        }
        book(available: "14", id: "2") {
            title("Catcher in the Rye")
            author(id: "2", "JD Salinger")
        }
        book(available: "13", id: "3") {
            title("Alice in Wonderland")
            author(id: "3", "Lewis Carroll")
        }
    }
}

将在请求中生成XML,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book available="20" id="1">
      <title>Don Xijote</title>
      <author id="1">Manuel De Cervantes</author>
   </book>
   <book available="14" id="2">
      <title>Catcher in the Rye</title>
      <author id="2">JD Salinger</author>
   </book>
   <book available="13" id="3">
      <title>Alice in Wonderland</title>
      <author id="3">Lewis Carroll</author>
   </book>
</books>

为了让我的客户更灵活,我通常会将测试中的数据结构作为地图传递给客户端:

def bookMap = [
    books: [[
                    id       : "1",
                    available: "20",
                    title    : "Don Xijote",
                    author   : [
                            id  : "1",
                            name: "Manuel De Cervantes"
                    ]
            ], [
                    id       : "2",
                    available: "14",
                    title    : "Catcher in the Rye",
                    author   : [
                            id  : "2",
                            name: "JD Salinger"
                    ]
            ], [
                    id       : "3",
                    available: "13",
                    title    : "Alice in Wonderland",
                    author   : [
                            id  : "3",
                            name: "Lewis Carroll"
                    ]
            ]
    ]

这就是客户现在的样子:

def bookXml = {
    books {
        bookMap.books.book.each {
            book(available: it.available, id: it.id) {
                title(it.available.title)
                author(id: it.author.id, it.author.name)
            }
        }
    }
}

我想做的一件事是在bookXml闭包中,如果我的数据结构中的值为null,有没有办法可以取出标记?

例如,如果我的第一本书的标题在地图中为空,那么在闭包中,它不会为第一本书创建此标签标题。

我知道如何在groovy集合中使用collectentries for map和collect for list,但我对转换闭包知之甚少。

请与我分享一些见解?

感谢。

2 个答案:

答案 0 :(得分:0)

我对构建器知之甚少,但似乎问题是如何忽略键会使地图中的值为空。

这可以通过使用带有两个arg闭包的each()方法来实现。在这种情况下传递给闭包的两个参数将是每个条目的键和值。

演示 -

def book = [
    id       : "1",
    available: "20",
    title    : null
]

book.each {key, value->
    if (value) {
        println "$key->$value"
    }
}

答案 1 :(得分:0)

我非常怀疑你能以简单的方式做你想做的事。如果你没有进入AST,那么闭包不是一个你可以轻松操作的数据结构。

IMO,您应该在将输入地图传递给bookXml之前使其保持一致。除此之外,坚持@diveshpremdeep回答。