Map groovy中的布尔方法总是返回true
这段代码有点愚蠢,但它完全代表了这个问题。 这两个映射不同,但始终返回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 }
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很高兴提供帮助!对不起,我花了这么长时间才说到点子上;-)玩得高兴