查看列表

时间:2016-03-01 21:11:57

标签: groovy

我写了这个简单的代码

​def x = [[a: 1], [a: 2], [a: 3]] 
if (x["foo"]) {
    print("Hello")
}​​​​​​

我的预期输出是不会打印Hello,因为x不包含" foo"。

然而,x["foo"]的输出为[null, null, null],它不为空且仍然进入if条件。

那么如何检查对象x是否不包含名为foo的属性?

1 个答案:

答案 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")
}