我是新来的Groovy和我已经遇到了一些问题了解each{}和eachwithindex{}语句Groovy中.
是each和eachWithIndex实际的方法?如果是这样,他们采取的论点是什么?
在groovy文档中有这个例子:
def numbers = [ 5, 7, 9, 12 ]
numbers.eachWithIndex{ num, idx -> println "$idx: $num" } //prints each index and number
Run Code Online (Sandbox Code Playgroud)
好吧,我看到那numbers是一个数组.什么是num和idx上面的语句?什么是->运营商吗?
我知道,$idx和$num打印的价值,但它是如何idx和num自动正与数组的索引和内容相关的?这背后的逻辑是什么?请帮忙.
oia*_*kyi 43
这些都是简单的方法,但它们遵循一个特定的模式 - 它们Closure作为最后一个参数.闭包是一种功能,您可以传递并在适用时调用.
例如,方法eachWithIndex可能看起来像这样(粗略地):
void eachWithIndex(Closure operation) {
for (int i = 0; this.hasNext(); i++) {
operation(this.next(), i); // Here closure passed as parameter is being called
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法允许人们构建通用算法(如项目上的迭代),并通过传递不同的闭包在运行时更改具体的处理逻辑.
关于参数部分,正如您在上面的示例中看到的,我们operation使用两个参数调用closure() - 当前元素和当前索引.这意味着eachWithIndex方法不仅要接收任何闭包,而且要接受接受这两个参数的闭包.从语法角度来看,在闭包定义期间定义参数,如下所示:
{ elem, index ->
// logic
}
Run Code Online (Sandbox Code Playgroud)
因此->用于将闭包定义的参数部分与其逻辑分开.当闭包只接受一个参数时,可以省略其参数定义,然后在闭包的作用域内使用名称it(第一个参数的隐式名称)访问该参数.例如:
[1,2,3].each {
println it
}
Run Code Online (Sandbox Code Playgroud)
它可以像这样重写:
[1,2,3].each({ elem ->
println elem
})
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Groovy语言添加了一些语法糖,使这些结构看起来更漂亮.
Tom*_*icz 13
each并且eachWithIndex,在许多其他人中,被Closure称为争论.闭包只是一个用{}大括号包裹的Groovy代码.在带有数组的代码中:
def numbers = [ 5, 7, 9, 12 ]
numbers.eachWithIndex{ num, idx -> println "$idx: $num" }
Run Code Online (Sandbox Code Playgroud)
只有一个参数(闭包,或更确切地说:函数),请注意在Groovy中,()大括号有时是可选的.num并且idx只是闭包(函数)参数的可选别名,当我们只需要一个参数时,这是等价的(it是第一个闭包参数的隐式名称,非常方便):
def numbers = [ 5, 7, 9, 12 ]
numbers.each {println "$it" }
Run Code Online (Sandbox Code Playgroud)
参考文献:
| 归档时间: |
|
| 查看次数: |
65281 次 |
| 最近记录: |