用Lambda替换匿名内部类。这是如何运作的?

时间:2015-08-05 10:53:10

标签: soap lambda java-8

在发送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);
                                    }
                                });

但是“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);
                });

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

1 个答案:

答案 0 :(得分:1)

Lambda表达式是匿名类的语法糖。只要类型是功能接口,Lambda就可以使用,这是一个只声明一个抽象方法的接口。 Lambda表达式提供了该单个方法的实现。

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