Groovy(Java笨狗)系列-Working with closures(1)

翻译自《Groovy in action》,如有不准确之处,希望指教!

 

closures(闭包)很重要,非常的重要!!!可以被认为是Groovy中一个非常有用的特性。同时,在你没有完全了解它之前会是一个陌生的概念。为了发挥Groovy最大功效,或者了解任何其他Groovy代码,它将肯定让你感觉轻松。不只是“一次婚礼上遇见它们”的轻松,而是“邀请它们参加周末烧烤”的轻松。(注原文: Not just
“met them once at a wedding” comfortable, but “invite them over for a barbecue on
the weekend” comfortable.)

 

此刻,我不是想吓跑你,closures(闭包)并不难---它只是不同于任何你过去习惯的事物。某种程度上,它是陌生的,因为在面向对象中一个首要的原则是对象拥有行为和数据。closures(闭包)是对象,在它的生命里最主要的目的是它们的行为---这几乎是他们的所有。

 

 

在这节我们将介绍closures(闭包)的基本概念,阐明它们的好处。然后,展示他们是怎样被定义和调用的。讨论基础之后,我们将更深入的探讨closures(闭包)中使用其他的方法和closures(闭包)的范围---即,它内部数据和成员的访问---以及,考虑closures(闭包)使用什么方法来返回。本节结尾,我们将讨论closures(闭包)怎样用于实现多数普通的设计模式和通过不同的解决方式来减轻另外某些需要。

 

因此,不再啰嗦,首先,让我们来看下实际中的closures(闭包)。

 

 

让我们以一个简单的closures(闭包)定义开始,然后,我们通过一个示例来扩展它。closures(闭包)作为一个对象包装在一个代码块中。closures(闭包)的作用就像一个方法,因为,它可以获取参数并能返回值。它是一个普通的对象,因为,你可以给他传递一个引用,就如你可以引用任何其他对象一样。别忘了,JVM不会知道你正在运行Groovy代码,因此,你可以使用一个closures(闭包)对象也就没有什么特别奇怪的了,它只是个对象。Groovy提供了一个非常简单的方法来创建closures(闭包)并赋予一些非常敏捷的行为。

 

 

假如,它能帮助你用类似于真实世界的方式来思考,假设,一个信封中的一张信纸,信纸上可能写着变量的值:“x=5, y=10”等等。对于closures(闭包)来说,信纸可能拥有一个指令列表,你可以把信封给某人,某人可能依照信纸上的指令来做决定,或者他可能同样把这个信封给其他人。每次根据不同的上下文,可能会按照信纸上面的指令来做决定很多次。例如:信纸上写着:”给你心里想着的人写一封信“,然后,他会在他的地址簿里寻找他心里想着的一系列的人,最后,根据上面的指令,一个一个的给他们写信。

 

 

closures(闭包)等同于上面真实生活的示例,可以表示成如下的形式:

Closure envelope = { person -> new Letter(person).send() }
addressBook.each (envelope)
 这是一个比较冗长的方式来处理它,不是Groovy惯用的.但是,它展示了closures(闭包)它自己(在这种情况下,envelope 变量的值) 和它用处(作为each方法中的参数.)之前的区别 。当第一次看到closures(闭包)的简写形式是难于理解。Groovy使它们非常简洁,因为它们经常被使用---但是,简写不利于学习过程。为了对比,先前的代码采用Groovy提供的简写形式,它往往有利于清楚的区分冗长的形式:
addressBook.each { new Letter(it).send() }
 

 

 

 

你可能感兴趣的:(java,设计模式,jvm,生活,groovy)