Groovy each()方法不能正确迭代

Groovy each()方法不能正确迭代,groovy,each,Groovy,Each,在尝试以下代码时,我遇到了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=

在尝试以下代码时,我遇到了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
}  
def xml=new XmlSlurper().parseText(“”)
A.
B
C
''')
DEFI=0
xml.'**'.findAll{it@a=='1'}。每个{
println“hi”+i
}  

结果只是
hi0
,但是我希望
hi0hi1
。这种行为是bug还是按语言设计?第二个结果仅在我编写
println“hi”+I++
而不是当前的闭包正文时提供,因此当每个项目的内容不同时

您的
i
变量没有递增,因为没有任何命令它递增。按照您当前编写代码的方式,我希望输出为:

hi0
hi0
我认为您需要的是
每个Withindex
,它为闭包提供了两个参数—当前项和项的索引。您的代码将如下所示:

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
}

非常感谢您的反馈。抱歉,是我的错误,问题不准确(之前已经调试了好几个小时,所以有点累:)。我也希望结果和你写的一样,
hi0\nhi0
,但是我只得到了一次,所以
hi0
。似乎只有在我添加了在迭代过程中发生变化的内容时才会执行两次。计数器、时间戳等(但时间戳只有在它发生变化时才会出现,因此,如果它只是一天,例如,那么它仍然会打印一次)。非常奇怪的行为。我正在使用Grails2.4.4…运行您提供的代码会导致两行“hi0”。您可以通过在本地Groovy控制台或通过位于的Groovy web控制台运行代码来看到这一点。我猜您的示例代码并不能准确地表示实际代码中发生的事情。也许您的
findAll
闭包没有按您期望的方式进行过滤?是的,它应该会产生两个结果,现在我再次检查,它仍然会产生一个。现在只需直接复制和粘贴代码(之前缺少defi=0):
defxml=newxmlslurper().parseText('abc'))defi=0xml.**'.findAll{it.@a='1'}。每个{println“hi”+i}
,结果是:
|运行脚本/test.groovy。。。hi0 |脚本/test.groovy完成。明天我将在工作场所查看它,并比较生成的字节码,因为这很烦人…:)
hi0
hi1