Groovy的闭包

闭包

Groovy中的闭包完全避免了代码的冗长,而且可以辅助创建轻量级、可复用的代码片段。通过对比闭包与我们所熟悉的传统解决方案在解决同样任务时的表现,就可以理解这种便利性。

假如你有个函数用来处理集合的值或者对象集合。可能是在选择的值上执行不同的操作。这 些被选择的值可能是一个数组,那么首先看看闭包是如何处理的。 下面的代码是求1—n的和

def sum(n) {
    total = 0
    for(int i = 2; i <= n; i += 2) {
        total += i
    }
    total
}
println "Sum of even numbers from 1 to 10 is ${sum(10)}"

sum( )方法中,你会遍历所有元素并计算他们的和。 如果你现在要求 1 — n的乘积:

def product(n) {
    prod = 1
    for(int i = 2; i <= n; i += 2) {
        prod *= i
    }
    prod
}
println "Product of even numbers from 1 to 10 is ${product(10)}"

你再一次遍历了所有的元素,然后求的乘积。 如果还想把1—n开平方后的结果存入集合中:

def sqr(n) {
    squared = []
    for(int i = 2; i <= n; i += 2) {
        squared << i ** 2 
    }
    squared
}
println "Squares of even numbers from 1 to 10 is ${sqr(10)}"

上面所有的代码,都是使用1—n来执行想要的操作. 你们觉得上面3个方法有什么不同之处? 如果你还想对1—n执行其他的操作,还会重复的遍历 。个人认为这不适合极限编程,应该 提取出类似的代码。

Groovy 的方式

让我们写一个提取偶数的函数。一旦找出偶数,就立即放进代码块执行,让代码块来简单的输出这个偶数:

def pickEven(n, block){
    for(int i = 2; i <= n; i += 2)
    {
        block(i)
    }
}
pickEven(10, { println it } )

pickEven( )迭代所有的值, 然后把合适的值传递给代码块——-闭包。这个可变的代码块持有一个对闭包的引用。 正如你传递对象一样,你也可以传递闭包。你不必为代码块命名,它可以是任何合法变量名。当你调用 pickEven( )时你可以像上面一样传递一个代码块。这个代码块({})传递给参数block,10被传递给变量n。在Groovy中。你想传递多少闭包进来都可以。这里要注意的是,如果方法的最后一个参数是闭包,一个简单的语法就像下面这样,:

pickEven(10) { println it }

Groovy 中的代码块不像 Java,它不能单独存在,必须依附于一个方法或赋值给一个命名变量。代码块中的 it 是什么?假如你只传递一个参数给代码块,那么这个参数在代码块中就可以使用 it 来引用。当然你可以自己定义一个变量名来引用这个参数:

pickEven(10) { 
    evenNumber -> println evenNumber 
}

再来看看 pickEven( ) 方法。现在可以方便的用于和的计算:

total = 0
pickEven(10) { total += it }
println "Sum of even numbers from 1 to 10 is ${total}"

同样可以用于乘积:

product = 1
pickEven(10) { product *= it }
println "Product of even numbers from 1 to 10 is ${product}"

闭包就是一个拥有参数的函数被绑定到上下文环境中来运行。闭包源于 lambda expressions:“ lambda expression 指定参数和函数映射,就是一个包含若干表达式和语句的匿名函数 ” 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值