2017-05-29 59 views
0

我偶然发现了find函数的这种奇怪行为。使用零int时发现错误?

如果我使用“查找”在整数数组中找到0,它即使在数组中有0也会返回null。如果我尝试使用“findall”或其他值(如2),它会按预期工作。

我剥了下来我的原代码,产生这个代码片段重现行为:

id = 0 

class Node { 
    int id = 1 
    Set Nlinks = [0] 
} 

b1 = [new Node()].find{it.Nlinks.find{it2 -> it2 == id }} 
b2 = [new Node()].find{it.Nlinks.findAll{it2 -> it2 == id }} 

println(b1?.id + " " + b2?.id) // Output: null 1 

id2 = 2 

class Node2 { 
    int id = 1 
    Set Nlinks = [2] 
} 

b3 = [new Node2()].find{it.Nlinks.find{it2 -> it2 == id2 }} 
b4 = [new Node2()].find{it.Nlinks.findAll{it2 -> it2 == id2 }} 

println(b3?.id + " " + b4?.id) // Output: 1 1 

这种行为预期,我想的东西,为什么这应该是它的行为方式,或者是这个一个错误?

回答

0
b1 = [new Node()].find{it.Nlinks.find{it2 -> it2 == id }} 

[0].find{it==0}(嵌套FIND)将查找并返回0

问题装置,用于将父找到表达式评估为0

b1 = [new Node()].find{ 0 } 

0(零)在常规==假

所以,只是改变你的表达为:

b1 = [new Node()].find{it.Nlinks.find{it2 -> it2 == id }!=null} 

http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find()

http://docs.groovy-lang.org/next/html/documentation/core-semantics.html#Groovy-Truth

+0

啊啊啊,现在我明白了我忽略了隐含的整数布尔Groovy的魔术外发现:) 嵌套发现返回一个整数和外找到刚才演算值为整型作为除非它被赋值为0,否则为true。而findAll的工作原理是因为它返回一个包含一个元素的数组,并且总是如此。 谢谢:) –

+0

别忘了Java下的内核: b1 = [new Node()]。find {it.Nlinks.contains(id)} – user1708042

相关问题