针对于groovy 中的闭包的疑问?

最近初学groovy,对groovy 中的闭包感到非常疑惑。闭包的重点应该放在上下文的区分之中,比如js中的闭包可以有效的防止变量污染。但groovy的中的闭包非常奇怪,一直都是整个方法作为上下文,这写法比java的lambda 还要狗血几分,而且也没有属于自己的上下文环境。用简单函数不行吗?为什么非得搞闭包?

阅读 2.4k
2 个回答

我感觉其实是起错名了,其实就是 Lambda,非得叫 Closure,它就是早年为了解决 Java 里没有匿名函数导致的“啰嗦”问题(后来 Java 8 才开始支持了)。

但早期 JVM 是不支持这个特性的,所以 Groovy 在“翻译”的时候实质它就是种数据类型、是个内部类、是个对象,并不单纯是语法层面上的东西。从这个角度上看也就不难理解为啥它在作用域/上下文上表现的和通常我们理解的“闭包”不同了。

结果 Java 8 开始有 Lambda 之后它的定位就很尴尬,因为人家改造了 JVM 以支持 Lambda;所以现在 Groovy 3.X 里同时有两个看着很类似的东西,一个是以前的 Closure、另一个是 Lambda,确实会造成困惑。

甚至连 Groovy 自己,都宣称这是个 Feature 而不是 Bug:

REF: https://groovy-lang.org/closu...
In opposition to the formal definition of a closure, Closure in the Groovy language can also contain free variables which are defined outside of its surrounding scope. While breaking the formal concept of a closure, it offers a variety of advantages which are described in this chapter.

大意就是“Groovy Closure 与通常我们所理解的那个闭包的定义不同,但 Groovy 之所以这么做是有 balabala 好处”……那你特么的改个名不就好了,非得叫 Closure 做毛线,你叫直接叫 Anonymous Functions 之类的都行啊。

如果要我猜的话,可能是因为类似匿名函数这种特性虽然最早是 Lisp 这门函数式语言里引入的,但第一个引入的 OOP 语言是 C# 1.0(2002 年),所以 2004 年立项、2007 年才发布的 Groovy 也许是不想跟 Java 的“死对头”用同一个名字吧。确信。

https://wjw465150.github.io/blog/Groovy/my_data/Java8/Java_8_lambdas_vs._Groovy_closures_(part_1_of_2).htm

这篇文章比较详细的总结了groovy closure vs java lambda。

简单来说,groovy的closure其实是个class,就叫 Closure,你把它当成一个语法糖,最终的结果是生成一个名为Closure的class就可以理解了。实际上你把groovy文件编译成class打开看看也就发现了。而lambda只是Interface,不是class,所以才会有很多使用上的区别

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进