我写了这个简单的代码
def x = [[a: 1], [a: 2], [a: 3]]
if (x["foo"]) {
print("Hello")
}
我的预期输出是不会打印Hello,因为x不包含" foo"。
然而,x["foo"]
的输出为[null, null, null]
,它不为空且仍然进入if条件。
那么如何检查对象x是否不包含名为foo的属性?
答案 0 :(得分:3)
要测试它是否包含此类密钥,您可以使用
for ($i = 0; $i < count($inputArray); $i++) {
$name = "array" . ($i + 1);
$$name = $inputArray[$i];
}
此处x*.containsKey("foo").any{it}
表示将以下方法应用于列表中的所有项目,所以
*.
返回
x*.containsKey("foo")
下一个[false,false,false]
将闭包应用于其中每个并检查其中是否有任何结果为真。在您的情况下,它返回false。
同样,我们可以做到
.any{it}
请注意,默认情况下,闭包使用变量x.any{it.containsKey("foo")}
。
在你的情况下,两者之间的选择并不重要。对于一个很长的列表,这个表单可能更好,因为it
方法可以提前纾困,如果它看到一个真值并避免检查列表中的所有地图。第一种形式没有那么奢侈(编译器可能会将它们优化为相同,但我不知道是否会发生这种情况)。
因此,我们可以将您的条件重写为
any
或
if (x.any{it.containsKey("foo")}) {
print("Hello")
}