如何用闭包创建表格模型?循环中闭包变量仅取最后值求帮助
解决Groovy循环中闭包捕获变量仅保留最后值的问题
这是Groovy里闭包非常常见的「变量捕获陷阱」——闭包捕获的是变量的引用,而非循环迭代时的当前值。当循环结束后,所有闭包都会指向变量最终的取值(也就是你遇到的4)。
问题重现(模拟你的错误代码场景)
假设你的代码结构大概是这样:
def table = [] def xbnList = [1,2,3,4] for (xbn in xbnList) { table.add({ -> // 这里的xbn会始终指向循环最后一个值4 return "标题${xbn}" }) } // 执行所有闭包,结果全是"标题4" table.each { println it() }
解决方案1:循环内创建局部变量保存当前值
在每次循环迭代时,把当前的xbn值赋值给一个局部变量,让闭包捕获这个局部变量的引用(每次循环的局部变量都是独立的):
def table = [] def xbnList = [1,2,3,4] for (xbn in xbnList) { // 关键:创建局部变量保存当前迭代值 def currentXbn = xbn table.add({ -> return "标题${currentXbn}" }) } // 现在会依次输出标题1、标题2、标题3、标题4 table.each { println it() }
解决方案2:使用Groovy的each循环替代传统for循环
Groovy的each方法会为每个元素创建独立的作用域,闭包会自动捕获当前迭代的元素值,不需要额外处理:
def table = [] def xbnList = [1,2,3,4] xbnList.each { xbn -> table.add({ -> return "标题${xbn}" }) } // 同样输出正确的结果 table.each { println it() }
原理说明
传统for循环中,xbn是一个作用域覆盖整个循环的变量,所有闭包共享同一个引用。而each循环每次迭代都会生成新的作用域,每个闭包捕获的是当前作用域下的xbn变量,自然就能保留每次迭代的正确值。
内容的提问来源于stack exchange,提问作者mightguy
相关产品推荐
相关产品推荐

