Boolean method in groovy always returns true

dictionary, equals, groovy

Solution

You are calling return from inside a closure `each`

This will just exit the closure, but will not return from the enclosing function

You can use `find` as an early terminating loop, and check the result for null

private static boolean compare() {
    def a = [a:'one',b:'two']
    def b = [c:'three',d:'four']

    if( a.size() != b.size() ) {
        return false
    }
    return a.find { a != b } == null
}

Or `return a == b` does the same as your compare method

Problem

This code is a little bit stupid but it represents the problem fully. The two maps are different but true is allways returned. Why is this happening? ``` class SampleTest { private static boolean compare() { def a = [a:'one',b:'two'] def b = [c:'three',d:'four'] if(a.size()!=b.size()) { return false } a.each { if(!a.equals(b)){ return false } } return true } static main(args) { println SampleTest.compare() } } ``` If I add additional variable then all works fine: ``` class SampleTest { private static boolean compareArtifact() { boolean areEqual = true def a = [a:'one',b:'two'] def b = [c:'three',d:'four'] if(a.size()!=b.size()) { return false } a.each { if(!a.equals(b)){ areEqual = false } } areEqual } static main(args) { println SampleTest.compareArtifact() } } ```

Original source