2017-05-29 56 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

相關問題