2017-05-29 6 views
0

私はfind関数のこの奇妙な振る舞いを見つけました。ゼロのintを使用するとfindのバグはありますか?

Integer Arrayで0を見つけるために "find"を使うと、配列に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}(ネストされた検索)が見つけ、0

を返すことに問題は式がGroovyで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のマジックに暗黙の整数を見落とし:) をネストされた検索が整数と見つけ外側が同じようにint型をevalutes返し、それを得ますtrueの場合は0を返し、falseの場合はfalseを返します。そして、findAllは1つの要素を持つ配列を返し、常にtrueであるために機能します。 ありがとう:) –

+0

フードの下でJavaを忘れないでください: b1 = [new Node()]。find {it.Nlinks.contains(id)} – user1708042

関連する問題