Map groovy中的布尔方法总是返回true

Map groovy中的布尔方法总是返回true,map,groovy,equals,Map,Groovy,Equals,这段代码有点愚蠢,但它完全代表了这个问题。 这两个映射不同,但始终返回true。为什么会这样 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 }

这段代码有点愚蠢,但它完全代表了这个问题。 这两个映射不同,但始终返回true。为什么会这样

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()
    }

}
如果我添加了其他变量,则所有变量都可以正常工作:

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()
    }

}

您正在从闭包内调用return
每个

这只会退出闭包,但不会从封闭函数返回

您可以使用
find
作为提前终止循环,并检查结果是否为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
}

或者
returna==b
执行与比较方法相同的操作

您正在从闭包内部调用return
每个

这只会退出闭包,但不会从封闭函数返回

您可以使用
find
作为提前终止循环,并检查结果是否为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
}

或者
returna==b
与您的compare方法相同

Ok,但是如何在每个闭包中退出该方法(返回false)?上面的示例是特意构造的,仅用于显示pourposes。我可以对Groovy说,返回语句不是针对corrent闭包,而是针对整个方法吗?@Xelian但您的代码应该返回什么?您将
a
b
进行比较,但是
a
将是
映射条目
b
将是
映射
(因此在上述示例中永远不会是
真的
)。我在我的答案中添加了一个使用
find
的示例,希望能有所帮助——尽管它仍然存在一个问题,即对于find,它永远不会返回
true
Ok,但“a”是Map,“b”也是Map。我不是每一张都比较,而是整个地图。因此,如果a.equals(b),则必须返回true。因此,以另一种方式问我们是否处于这样的闭包中,我们如何能够逃避这个方法以及该方法的其余部分不被执行。就像在java中一样,如果我们点击return,剩下的代码会被跳过吗?我们可以在Groovy中执行此操作吗?@Xelian您有3个选项。1) 使用类似于
find
的方法,当闭包返回
true
2)使用中间变量,如
areEqual
示例3)使用for循环而不是基于闭包的循环结构。@Xelian很高兴提供帮助!对不起,我花了这么长时间才说到点子上;-)玩得高兴好的,但是如何从每个闭包中的方法(返回false)中退出呢?上面的示例是特意构造的,仅用于显示pourposes。我可以对Groovy说,返回语句不是针对corrent闭包,而是针对整个方法吗?@Xelian但您的代码应该返回什么?您将
a
b
进行比较,但是
a
将是
映射条目
b
将是
映射
(因此在上述示例中永远不会是
真的
)。我在我的答案中添加了一个使用
find
的示例,希望能有所帮助——尽管它仍然存在一个问题,即对于find,它永远不会返回
true
Ok,但“a”是Map,“b”也是Map。我不是每一张都比较,而是整个地图。因此,如果a.equals(b),则必须返回true。因此,以另一种方式问我们是否处于这样的闭包中,我们如何能够逃避这个方法以及该方法的其余部分不被执行。就像在java中一样,如果我们点击return,剩下的代码会被跳过吗?我们可以在Groovy中执行此操作吗?@Xelian您有3个选项。1) 使用类似于
find
的方法,当闭包返回
true
2)使用中间变量,如
areEqual
示例3)使用for循环而不是基于闭包的循环结构。@Xelian很高兴提供帮助!对不起,我花了这么长时间才说到点子上;-)玩得高兴