Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy闭包解释_Groovy - Fatal编程技术网

Groovy闭包解释

Groovy闭包解释,groovy,Groovy,我熟悉像这样的常规groovy闭包 def printSum = {a,b -> println a+b } printSum(5,7) // 12 然而,我遇到了来自SpringWS插件的代码,我很难理解: def withEndpointRequest = { url, payload -> def writer = new StringWriter() def request = new MarkupBuilder(writer) payloa

我熟悉像这样的常规groovy闭包

def printSum = {a,b ->
   println a+b
}

printSum(5,7) // 12
然而,我遇到了来自SpringWS插件的代码,我很难理解:

def withEndpointRequest = { url, payload ->
    def writer = new StringWriter()
    def request = new MarkupBuilder(writer)
    payload.delegate = request
    payload.call()
    def webServiceTemplate = new WebServiceTemplate()

    def response = webServiceTemplate.sendToEndpoint(url, writer.toString())
    new XmlSlurper().parseText(response)
}
我知道以上是一个结束

它是这样使用的:

    def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
    def serviceURL = "http://localhost:8080/myapp/services"
    def response = withEndpointRequest(serviceURL) {
        HolidayRequest(xmlns: namespace) {
            Holiday {
                StartDate("2006-07-03")
                EndDate("2006-07-07")
            }
            Employee {
                Number("42")
                FirstName("Russ")
                LastName("Miles")
            }
        }
    }
如果正在传入
serviceURL
,那么有效负载在哪里


有人能详细解释一下这个代码段吗?

在上面的实现中,
withEndpointRequest
是一个包含两个参数的闭包

withEndpointRequest(字符串serviceUrl,闭包负载)

当您从客户端使用
with endpointrequest
时,您实际上是在

    def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
    def serviceURL = "http://localhost:8080/myapp/services"
    def payload = {
         HolidayRequest(xmlns: namespace) {
            Holiday {
                StartDate("2006-07-03")
                EndDate("2006-07-07")
            }
            Employee {
                Number("42")
                FirstName("Russ")
                LastName("Miles")
            }
        }
    }
    def response = withEndpointRequest(serviceURL, payload) 
通过使用
withEndpointRequest
内联声明闭包,上述操作变得更加groovier。 上述内容也可以写成

def response = withEndpointRequest(serviceURL, {
        //payload goes here as an inline closure as the second parameter
        HolidayRequest(xmlns: namespace) {
            Holiday {
                StartDate("2006-07-03")
                EndDate("2006-07-07")
            }
            Employee {
                Number("42")
                FirstName("Russ")
                LastName("Miles")
            }
        }
    })
这就不那么冗长了。最后,通过编写如下代码,它可以被简化并变得更为常规

def response = withEndpointRequest(serviceURL) {
        HolidayRequest(xmlns: namespace) {
            Holiday {
                StartDate("2006-07-03")
                EndDate("2006-07-07")
            }
            Employee {
                Number("42")
                FirstName("Russ")
                LastName("Miles")
            }
        }
    }
这里需要注意的一点是,
关闭负载
是最后一个参数

现在,请注意,闭包(
payload
)在调用
payload.call()
之前不会被调用,正如您在SpringWS插件中的问题中提到的那样

看一看


我希望我能表达你想要理解的内容。:)

下面发布的snipet概述了用于将闭包传递到方法中的几个选项

具有两个参数的方法。最后一个参数是闭包

def work(input, cl) {
    cl(input)
}
def assertJava = {
    it == 'Java'
}
定义一个闭包

def work(input, cl) {
    cl(input)
}
def assertJava = {
    it == 'Java'
}
将闭包传递给方法的方法

work('Java', assertJava)

work 'Java', assertJava  // No parenthesis.

work('Groovy', {
    assert it == 'Groovy'
})  // Anonymous closure as argument.

work('Groovy') {
    assert it == 'Groovy'
}  // Last argument is closure and can be outside parenthesis. 

work('Groovy')
{
     assert it == 'Groovy'
}  // Opening bracket on new line. If we want a code block (e.g. static initializer) instead of closure we must use ; to separate code.


work 'Groovy', {
    assert it == 'Groovy'
}  // Pay attention, no parenthesis, so comma is needed again!


// Does not work:
//
// Comma between argument list needed:
// work 'Groovy' {
//     assert it == 'Groovy'
// }

看起来负载是由插件用某种方法截取注入的。括号中的东西就是负载(HolidayRequest)。也许Groovy有一些语法糖,可以让您以这种方式指定函数参数?试着通过调用
printSum(5){7}
或类似的方法来测试它。