我在Groovy中有一张地图:
['keyOfInterest' : 1, 'otherKey': 2]
有一个包含许多这些地图的列表。我想知道列表中是否存在具有特定值的keyOfInterest
的地图。
如果数据类型是简单对象,我可以使用indexOf()
,但我不知道如何使用更复杂的类型。例如。 (取自docs)
assert ['a', 'b', 'c', 'd', 'c'].indexOf('z') == -1 // 'z' is not in the list
我想做点什么:
def mapA = ['keyOfInterest' : 1, 'otherKey': 2]
def mapB = ['keyOfInterest' : 3, 'otherKey': 2]
def searchMap = ['keyOfInterest' : 1, 'otherKey': 5]
def list = [mapA, mapB]
assert list.indexOf(searchMap) == 0 // keyOfInterest == 1 for both mapA and searchMap
有没有办法用更复杂的对象(如地图)轻松完成?
答案 0 :(得分:1)
虽然@dmahapatro是正确的,但您可以使用find()
在具有匹配索引的地图列表中查找地图...这不是您要求的。因此,我将展示如何获取列表中该条目的索引,或者只显示匹配keyOfInterest的映射是否存在。
def mapA = ['keyOfInterest' : 1, 'otherKey': 2]
def mapB = ['keyOfInterest' : 3, 'otherKey': 2]
def searchMap = ['keyOfInterest':1, 'otherKey': 55 ]
def list = [mapA, mapB]
// findIndexOf() returns the first index of the map that matches in the list, or -1 if none match
assert list.findIndexOf { it.keyOfInterest == searchMap.keyOfInterest } == 0
assert list.findIndexOf { it.keyOfInterest == 33 } == -1
// any() returns a boolean OR of all the closure results for each entry in the list.
assert list.any { it.keyOfInterest == searchMap.keyOfInterest } == true
assert list.any { it.keyOfInterest == 33 } == false
请注意,使用one over other会导致性能下降,因为只要找到一个匹配项,它们就会全部停止。 find()
为您提供最多信息,但如果您实际上正在查找索引或布尔结果,也可以使用其他结果。
答案 1 :(得分:0)
最简单的实现是使用find()
。当在提供的闭包中不满足条件时,它返回null。
def mapA = ['keyOfInterest' : 1, 'otherKey': 2]
def mapB = ['keyOfInterest' : 3, 'otherKey': 2]
def list = [mapA, mapB]
assert list.find { it.keyOfInterest == 1 } == ['keyOfInterest':1, 'otherKey':2]
assert !list.find { it.keyOfInterest == 7 }