Different behaviour for lambda and anonymous transformer












2














When a lambda expression is used to define a transformer that accepts a source of type Message, a ClassCastException is raised. However if a semantically identical transformer is defined with an anonymous inner class, no errors occur.



@Bean
public IntegrationFlow lambda(MessageChannel outputChannel) {
return f -> f
.enrichHeaders(h -> h.header("add", 1))
.<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
.channel(outputChannel);
}

@Bean
public IntegrationFlow anonymous(MessageChannel outputChannel) {
return f -> f
.enrichHeaders(h -> h.header("add", 1))
.transform(new GenericTransformer<Message<Integer>, Integer>() {
@Override
public Integer transform(Message<Integer> source) {
return source.getPayload() + source.getHeaders().get("add", Integer.class);
}
})
.channel(outputChannel);
}


The full stack trace is:



org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}], failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:114)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:415)
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:334)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:225)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
at org.example.LambdaVsAnonymousTest.lambda(LambdaVsAnonymousTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:125)
at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:113)
at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:108)
... 55 more
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:122)
... 57 more


I am wondering which is the desired behaviour; should the transformer be able to accept a Message or should it fail because the payload type is expected? However I think that the behaviour should be identical for both styles.



A sample project can be found here. Please check org.example.LambdaVsAnonymous and org.example.LambdaVsAnonymousTest.










share|improve this question



























    2














    When a lambda expression is used to define a transformer that accepts a source of type Message, a ClassCastException is raised. However if a semantically identical transformer is defined with an anonymous inner class, no errors occur.



    @Bean
    public IntegrationFlow lambda(MessageChannel outputChannel) {
    return f -> f
    .enrichHeaders(h -> h.header("add", 1))
    .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
    .channel(outputChannel);
    }

    @Bean
    public IntegrationFlow anonymous(MessageChannel outputChannel) {
    return f -> f
    .enrichHeaders(h -> h.header("add", 1))
    .transform(new GenericTransformer<Message<Integer>, Integer>() {
    @Override
    public Integer transform(Message<Integer> source) {
    return source.getPayload() + source.getHeaders().get("add", Integer.class);
    }
    })
    .channel(outputChannel);
    }


    The full stack trace is:



    org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}], failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:114)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:415)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:334)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:225)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
    at org.example.LambdaVsAnonymousTest.lambda(LambdaVsAnonymousTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
    Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
    at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:125)
    at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:113)
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:108)
    ... 55 more
    Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:122)
    ... 57 more


    I am wondering which is the desired behaviour; should the transformer be able to accept a Message or should it fail because the payload type is expected? However I think that the behaviour should be identical for both styles.



    A sample project can be found here. Please check org.example.LambdaVsAnonymous and org.example.LambdaVsAnonymousTest.










    share|improve this question

























      2












      2








      2







      When a lambda expression is used to define a transformer that accepts a source of type Message, a ClassCastException is raised. However if a semantically identical transformer is defined with an anonymous inner class, no errors occur.



      @Bean
      public IntegrationFlow lambda(MessageChannel outputChannel) {
      return f -> f
      .enrichHeaders(h -> h.header("add", 1))
      .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
      .channel(outputChannel);
      }

      @Bean
      public IntegrationFlow anonymous(MessageChannel outputChannel) {
      return f -> f
      .enrichHeaders(h -> h.header("add", 1))
      .transform(new GenericTransformer<Message<Integer>, Integer>() {
      @Override
      public Integer transform(Message<Integer> source) {
      return source.getPayload() + source.getHeaders().get("add", Integer.class);
      }
      })
      .channel(outputChannel);
      }


      The full stack trace is:



      org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}], failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
      at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:114)
      at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
      at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
      at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
      at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
      at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:415)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:334)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:225)
      at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
      at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
      at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
      at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
      at org.example.LambdaVsAnonymousTest.lambda(LambdaVsAnonymousTest.java:39)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
      at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
      at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
      at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
      at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
      at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
      Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
      at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:125)
      at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:113)
      at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:108)
      ... 55 more
      Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:122)
      ... 57 more


      I am wondering which is the desired behaviour; should the transformer be able to accept a Message or should it fail because the payload type is expected? However I think that the behaviour should be identical for both styles.



      A sample project can be found here. Please check org.example.LambdaVsAnonymous and org.example.LambdaVsAnonymousTest.










      share|improve this question













      When a lambda expression is used to define a transformer that accepts a source of type Message, a ClassCastException is raised. However if a semantically identical transformer is defined with an anonymous inner class, no errors occur.



      @Bean
      public IntegrationFlow lambda(MessageChannel outputChannel) {
      return f -> f
      .enrichHeaders(h -> h.header("add", 1))
      .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))
      .channel(outputChannel);
      }

      @Bean
      public IntegrationFlow anonymous(MessageChannel outputChannel) {
      return f -> f
      .enrichHeaders(h -> h.header("add", 1))
      .transform(new GenericTransformer<Message<Integer>, Integer>() {
      @Override
      public Integer transform(Message<Integer> source) {
      return source.getPayload() + source.getHeaders().get("add", Integer.class);
      }
      })
      .channel(outputChannel);
      }


      The full stack trace is:



      org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}], failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
      at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:114)
      at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
      at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
      at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
      at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
      at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
      at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:415)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:334)
      at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:225)
      at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:129)
      at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
      at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
      at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
      at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:459)
      at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:400)
      at org.example.LambdaVsAnonymousTest.lambda(LambdaVsAnonymousTest.java:39)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
      at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
      at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
      at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
      at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
      at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
      Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message, failedMessage=GenericMessage [payload=0, headers={add=1, id=ed1e39d9-a91b-0bdf-5083-48218ba4e26f, timestamp=1542652005152}]
      at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:125)
      at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:113)
      at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:108)
      ... 55 more
      Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to org.springframework.messaging.Message
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.springframework.integration.handler.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:122)
      ... 57 more


      I am wondering which is the desired behaviour; should the transformer be able to accept a Message or should it fail because the payload type is expected? However I think that the behaviour should be identical for both styles.



      A sample project can be found here. Please check org.example.LambdaVsAnonymous and org.example.LambdaVsAnonymousTest.







      spring-integration






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 19 '18 at 18:38









      Frank SigalasFrank Sigalas

      325




      325
























          2 Answers
          2






          active

          oldest

          votes


















          3














          I believe you have to use the typed variant of the transform(..). For example .transform(Message.class, m -> m.getPayload() + m.getHeaders().get("add", Integer.class)).
          That said I believe we should improve javadoc a bit since it talks about <P> the payload type - 'transform from' while it should simply talk about type of input transformer should accept. .






          share|improve this answer





















          • The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
            – Artem Bilan
            Nov 19 '18 at 22:00



















          1














          It's a limitation of Java Lambdas.



          Method.getParameterTypes() 


          just returns Object when invoked on a Lambda.



          The type information here...



          .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))


          ...is just syntactic sugar to allow you to reference the proper types in the lambda (similar to doing explicit casting within the lambda). It is not baked into the lambda.



          There is just no way to infer that the lambda expects a Message<?>.



          With the anonymous inner class, the type information is retained since the method has concrete types.






          share|improve this answer





















          • Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
            – Gary Russell
            Nov 19 '18 at 19:36










          • I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
            – Frank Sigalas
            Nov 19 '18 at 19:52










          • Understood - no problem here.
            – Gary Russell
            Nov 19 '18 at 19:57











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53380765%2fdifferent-behaviour-for-lambda-and-anonymous-transformer%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          3














          I believe you have to use the typed variant of the transform(..). For example .transform(Message.class, m -> m.getPayload() + m.getHeaders().get("add", Integer.class)).
          That said I believe we should improve javadoc a bit since it talks about <P> the payload type - 'transform from' while it should simply talk about type of input transformer should accept. .






          share|improve this answer





















          • The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
            – Artem Bilan
            Nov 19 '18 at 22:00
















          3














          I believe you have to use the typed variant of the transform(..). For example .transform(Message.class, m -> m.getPayload() + m.getHeaders().get("add", Integer.class)).
          That said I believe we should improve javadoc a bit since it talks about <P> the payload type - 'transform from' while it should simply talk about type of input transformer should accept. .






          share|improve this answer





















          • The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
            – Artem Bilan
            Nov 19 '18 at 22:00














          3












          3








          3






          I believe you have to use the typed variant of the transform(..). For example .transform(Message.class, m -> m.getPayload() + m.getHeaders().get("add", Integer.class)).
          That said I believe we should improve javadoc a bit since it talks about <P> the payload type - 'transform from' while it should simply talk about type of input transformer should accept. .






          share|improve this answer












          I believe you have to use the typed variant of the transform(..). For example .transform(Message.class, m -> m.getPayload() + m.getHeaders().get("add", Integer.class)).
          That said I believe we should improve javadoc a bit since it talks about <P> the payload type - 'transform from' while it should simply talk about type of input transformer should accept. .







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 19 '18 at 19:24









          Oleg ZhurakouskyOleg Zhurakousky

          1,36666




          1,36666












          • The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
            – Artem Bilan
            Nov 19 '18 at 22:00


















          • The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
            – Artem Bilan
            Nov 19 '18 at 22:00
















          The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
          – Artem Bilan
          Nov 19 '18 at 22:00




          The PR on the matter has been merged github.com/spring-projects/spring-integration/pull/2636
          – Artem Bilan
          Nov 19 '18 at 22:00













          1














          It's a limitation of Java Lambdas.



          Method.getParameterTypes() 


          just returns Object when invoked on a Lambda.



          The type information here...



          .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))


          ...is just syntactic sugar to allow you to reference the proper types in the lambda (similar to doing explicit casting within the lambda). It is not baked into the lambda.



          There is just no way to infer that the lambda expects a Message<?>.



          With the anonymous inner class, the type information is retained since the method has concrete types.






          share|improve this answer





















          • Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
            – Gary Russell
            Nov 19 '18 at 19:36










          • I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
            – Frank Sigalas
            Nov 19 '18 at 19:52










          • Understood - no problem here.
            – Gary Russell
            Nov 19 '18 at 19:57
















          1














          It's a limitation of Java Lambdas.



          Method.getParameterTypes() 


          just returns Object when invoked on a Lambda.



          The type information here...



          .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))


          ...is just syntactic sugar to allow you to reference the proper types in the lambda (similar to doing explicit casting within the lambda). It is not baked into the lambda.



          There is just no way to infer that the lambda expects a Message<?>.



          With the anonymous inner class, the type information is retained since the method has concrete types.






          share|improve this answer





















          • Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
            – Gary Russell
            Nov 19 '18 at 19:36










          • I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
            – Frank Sigalas
            Nov 19 '18 at 19:52










          • Understood - no problem here.
            – Gary Russell
            Nov 19 '18 at 19:57














          1












          1








          1






          It's a limitation of Java Lambdas.



          Method.getParameterTypes() 


          just returns Object when invoked on a Lambda.



          The type information here...



          .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))


          ...is just syntactic sugar to allow you to reference the proper types in the lambda (similar to doing explicit casting within the lambda). It is not baked into the lambda.



          There is just no way to infer that the lambda expects a Message<?>.



          With the anonymous inner class, the type information is retained since the method has concrete types.






          share|improve this answer












          It's a limitation of Java Lambdas.



          Method.getParameterTypes() 


          just returns Object when invoked on a Lambda.



          The type information here...



          .<Message<Integer>, Integer>transform(m -> m.getPayload() + m.getHeaders().get("add", Integer.class))


          ...is just syntactic sugar to allow you to reference the proper types in the lambda (similar to doing explicit casting within the lambda). It is not baked into the lambda.



          There is just no way to infer that the lambda expects a Message<?>.



          With the anonymous inner class, the type information is retained since the method has concrete types.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 19 '18 at 19:19









          Gary RussellGary Russell

          79.2k74471




          79.2k74471












          • Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
            – Gary Russell
            Nov 19 '18 at 19:36










          • I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
            – Frank Sigalas
            Nov 19 '18 at 19:52










          • Understood - no problem here.
            – Gary Russell
            Nov 19 '18 at 19:57


















          • Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
            – Gary Russell
            Nov 19 '18 at 19:36










          • I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
            – Frank Sigalas
            Nov 19 '18 at 19:52










          • Understood - no problem here.
            – Gary Russell
            Nov 19 '18 at 19:57
















          Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
          – Gary Russell
          Nov 19 '18 at 19:36




          Also see Oleg's answer regarding the use of the overloaded .transform that takes an explicit from type.
          – Gary Russell
          Nov 19 '18 at 19:36












          I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
          – Frank Sigalas
          Nov 19 '18 at 19:52




          I switched the accepted answer as it provides a concrete solution to my problem, however this one provides some insight as to what actually happens. I wish I could accept both!
          – Frank Sigalas
          Nov 19 '18 at 19:52












          Understood - no problem here.
          – Gary Russell
          Nov 19 '18 at 19:57




          Understood - no problem here.
          – Gary Russell
          Nov 19 '18 at 19:57


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53380765%2fdifferent-behaviour-for-lambda-and-anonymous-transformer%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          MongoDB - Not Authorized To Execute Command

          How to fix TextFormField cause rebuild widget in Flutter

          Npm cannot find a required file even through it is in the searched directory