Soap 用Lambda替换匿名内部类。这是怎么回事?

Soap 用Lambda替换匿名内部类。这是怎么回事?,soap,lambda,java-8,Soap,Lambda,Java 8,在发送SOAP消息时,我想添加一些自定义头,所以我喜欢下面的内容 JAXBElement<ConfigurationResponse> jaxbElementResponse = (JAXBElement<ConfigurationResponse>) getWebServiceTemplate() .marshalSendAndReceive(urlToSend,

在发送SOAP消息时,我想添加一些自定义头,所以我喜欢下面的内容

JAXBElement<ConfigurationResponse> jaxbElementResponse = (JAXBElement<ConfigurationResponse>) getWebServiceTemplate()
                        .marshalSendAndReceive(urlToSend,
                                new ObjectFactory().createConfigurationRequest(request),
                                new WebServiceMessageCallback() {
                                    @Override
                                    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
                                        SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                                        SoapHeaderElement id = soapMessage.getSoapHeader().addHeaderElement(new QName(uri, localpart, prefix));
                                        id.setText(text);
                                    }
                                });
JAXBElement-jaxbElementResponse=(JAXBElement)getWebServiceTemplate()
.MarshallSendReceive(urlToSend,
新建ObjectFactory().createConfigurationRequest(请求),
新的WebServiceMessageCallback(){
@凌驾
public void doWithMessage(WebServiceMessage消息)引发IOException、TransformerException{
SaajSoapMessage soapMessage=(SaajSoapMessage)消息;
SoapHeaderElement id=soapMessage.getSoapHeader().addHeaderElement(新的QName(uri,localpart,前缀));
id.setText(文本);
}
});
但是“NetBeans”告诉我可以使用lambda expr。所以如果我做了改变,就像

JAXBElement<ConfigurationResponse> jaxbElementResponse = (JAXBElement<ConfigurationResponse>) getWebServiceTemplate()
                        .marshalSendAndReceive(urlToSend,
                                new ObjectFactory().createConfigurationRequest(request), (WebServiceMessage message) -> {
                                    SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                                    SoapHeaderElement id = soapMessage.getSoapHeader().addHeaderElement(new QName(uri, localpart, prefix));
                                    id.setText(text);
                });
JAXBElement-jaxbElementResponse=(JAXBElement)getWebServiceTemplate()
.MarshallSendReceive(urlToSend,
新建ObjectFactory().createConfigurationRequest(请求),(WebServiceMessage消息)->{
SaajSoapMessage soapMessage=(SaajSoapMessage)消息;
SoapHeaderElement id=soapMessage.getSoapHeader().addHeaderElement(新的QName(uri,localpart,前缀));
id.setText(文本);
});

都一样吗?如果是,这是如何工作的?

Lambda表达式是匿名类上的语法糖。Lambda可以在类型为函数接口的情况下使用,函数接口只声明一个抽象方法。Lambda表达式提供了该单一方法的实现


对于您的情况,WebServiceMessageCallback是一个功能接口。它有一个抽象方法:doWithMessage(…)。您创建的Lambda表达式提供了该方法的实现。

它不一样,更好!特别是它没有捕获
这个
对象。@TagirValeev:很好!但我不明白这是怎么回事。例如,它如何使用
doWithMessage()
而不提及方法名称?