如何在Groovy闭包中用星号展开运算符拆解末尾参数?
Groovy闭包中实现类似Python的参数部分拆解
要实现类似Python中first, *others的列表部分拆解效果,Groovy里可以通过两种方式解决:
方法1:闭包内部解构赋值
直接在闭包内对传入的列表进行解构,这是最直观的写法:
inputs = [['a', 'b', 'c', 'd'], ['A', 'B', 'C']] inputs.each { list -> def (first, *others) = list println "first=$first others=${others.join(',')}" }
执行后输出:
first=a others=b,c,d first=A others=B,C
方法2:闭包参数括号解构
给闭包参数加上括号,明确告知Groovy要对传入的单个列表进行解构:
inputs = [['a', 'b', 'c', 'd'], ['A', 'B', 'C']] inputs.each { (first, *others) -> println "first=$first others=${others.join(',')}" }
输出结果和方法1完全一致。
为什么之前的尝试失败?
- 尝试1的
first, *others ->写法错误:Groovy默认把inputs中的每个元素当作闭包的单个参数,这里每个元素都是完整列表,所以first会被赋值为整个列表,others因无额外参数而为空。 - 尝试2的
String... others可变参数写法同理:闭包将整个列表作为第一个参数first传入,没有后续参数,因此others始终是空数组。
内容的提问来源于stack exchange,提问作者PlasmaBinturong
相关产品推荐
相关产品推荐

