如何在Groovy中为地图实现比较器?

时间:2015-03-26 20:19:12

标签: groovy

我在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

有没有办法用更复杂的对象(如地图)轻松完成?

2 个答案:

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