Groovy - 奇怪的集合#交叉行为

时间:2016-02-18 21:48:31

标签: groovy

我有这样的代码:

def a1 = [[1],[2],[3]]
def a2 = [[2],[3],[4]]
a1.intersect(a2)

结果得到:

[]

经过一段时间的研究后,我发现列表元素必须是可比较的实例。在DefaultGroovyMethods中我们可以看到交叉方法的实现。我注意到的第一件事是用于检查我们的一个列表中对象存在的集合(TreeSet)(顺便说一句。如果HashSet使用它工作正常)。

我检查了NumberAwareComparator有两个选项来检查compareTo方法。第一个是与另一个类的比较委托(吃了异常?!),第二个是hashCode检查。

第一个选项DefaultTypeTransformation向我们解释了行为。 我们可以看到,只有被比较的允许对象才是可比较的,在其他情况下我们稍后会吃掉异常。

我的问题是为什么会这样?关于它的文档中缺少信息(或者我错了吗?)。我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

无法记录下来。

感觉就像对github项目的一个很好的拉取请求贡献,对现有文档/ javadoc进行了更改以使其更加明确?

元素必须具有可比性,否则您无法将它们进行比较以检查交叉点,但您对文档的描述并不明确。

您可以编写自己的实现:

.

那样Collection.metaClass.equalityIntersect = { Collection other -> delegate.findAll { a -> other.find { it == a } } }

答案 1 :(得分:0)

此行为已在某个地方引入 - 没有针对它,可能2.4.22.4.2this commit。它过去曾在2.2.12.4.0中使用,但在2.4.6上已被删除...但它已在2.4.7中修复。

$ groovy -v
Groovy Version: 2.4.7 JVM: 1.8.0_92 Vendor: Oracle Corporation OS: Mac OS X
$ groovy intersect.groovy
[[2], [3]]

如何将这种突破性变化推向发布对我来说是一个谜。缺乏测试?