我有这样的代码:
def a1 = [[1],[2],[3]]
def a2 = [[2],[3],[4]]
a1.intersect(a2)
结果得到:
[]
经过一段时间的研究后,我发现列表元素必须是可比较的实例。在DefaultGroovyMethods中我们可以看到交叉方法的实现。我注意到的第一件事是用于检查我们的一个列表中对象存在的集合(TreeSet)(顺便说一句。如果HashSet使用它工作正常)。
我检查了NumberAwareComparator有两个选项来检查compareTo方法。第一个是与另一个类的比较委托(吃了异常?!),第二个是hashCode检查。
第一个选项DefaultTypeTransformation向我们解释了行为。 我们可以看到,只有被比较的允许对象才是可比较的,在其他情况下我们稍后会吃掉异常。
我的问题是为什么会这样?关于它的文档中缺少信息(或者我错了吗?)。我错过了什么吗?
答案 0 :(得分:0)
无法记录下来。
感觉就像对github项目的一个很好的拉取请求贡献,对现有文档/ javadoc进行了更改以使其更加明确?
元素必须具有可比性,否则您无法将它们进行比较以检查交叉点,但您对文档的描述并不明确。
您可以编写自己的实现:
.
那样Collection.metaClass.equalityIntersect = { Collection other ->
delegate.findAll { a -> other.find { it == a } }
}
答案 1 :(得分:0)
此行为已在某个地方引入 - 没有针对它,可能2.4.2
或2.4.2
按this commit。它过去曾在2.2.1
和2.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]]
如何将这种突破性变化推向发布对我来说是一个谜。缺乏测试?