EachWithIndex groovy声明

Vam*_*ani 30 groovy

我是新来的Groovy和我已经遇到了一些问题了解each{}eachwithindex{}语句Groovy中.

eacheachWithIndex实际的方法?如果是这样,他们采取的论点是什么?

在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是一个数组.什么是numidx上面的语句?什么是->运营商吗?

我知道,$idx$num打印的价值,但它是如何idxnum自动正与数组的索引和内容相关的?这背后的逻辑是什么?请帮忙.

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)

参考文献: