I took a look at the new Groovy 3 changes at http://groovy-lang.org/releasenotes/groovy-3.0.html and noticed there is still a question as to whether or not to implement lambdas, method references, and default methods as closures and traits. Is the Groovy team still taking feedback on these decisions?
If so, my vote would be to by default, emit JDK8+ "native" implementations wherever possible. I would even go as far to say to allow Groovy 3 to emit JDK8+ lambdas for any expression where a closure inline to a method taking a SAM, as a way to improve Groovy 2 code, but I can understand why it might be better to be consistent and have closure blocks always generate closures (as closures have delegate concept that extends Java lambdas). The reason for my vote is I work on a large Groovy project where performance is a significant consideration. My experience so far is that using closures with streams has poor performance such that any time I want to use streams I either write the class in Java or I make a utility class with the Streams code and call that utility class from Groovy. It is unfortunate that JDK 8's enhancements make Groovy feel a lot less necessary to me, especially since I learned how hard it is to avoid BigDecimal math even when using CompileStatic. We are working with a business rules system and sometimes a single rule can trigger 1k+ times within a single page refresh, so we have to pay attention to which Groovy features we use in certain rules. Avoiding closures, using for in preference to .each, etc., can result in order of magnitude speedup. That's why my vote is to have Groovy compile static generate code as close to Java as possible, whenever a choice is possible. Jason Winnebeck This email message and any attachments are for the sole use of the intended recipient(s). Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message and any attachments.