尝试此代码时,我遇到了each()方法的奇怪行为:
def xml = new XmlSlurper().parseText('''
<list>
<item a="1">a</item>
<item a="2">b</item>
<item a="1">c</item>
</list>
''')
def i = 0
xml.'**'.findAll { it.@a=='1' }.each {
println "hi" + i
}
Run Code Online (Sandbox Code Playgroud)
结果只是hi0,但我希望如此hi0hi1.这种行为是错误还是每种语言设计?第二个结果只有在我写println "hi" + i++而不是当前的闭包体时才提供,所以当每个项目的内容不同时......
您的i变量没有递增,因为没有任何东西可以告诉它增加.你的代码当前编写的方式,我希望输出为:
hi0
hi0
Run Code Online (Sandbox Code Playgroud)
我认为你要找的是eachWithIndex,它为闭包提供了两个参数 - 当前项和项的索引.您的代码将如下所示:
def xml = new XmlSlurper().parseText('''
<list>
<item a="1">a</item>
<item a="2">b</item>
<item a="1">c</item>
</list>
''')
xml.'**'.findAll { it.@a=='1' }.eachWithIndex { item, i ->
println "hi" + i
}
Run Code Online (Sandbox Code Playgroud)
这导致输出:
hi0
hi1
Run Code Online (Sandbox Code Playgroud)