Kotlin 原生支持 集合的几种操作,分别是:交集、差集、并集。
非常有用的功能,这里我简单做一个总结。
的意思是,2个集合共同拥有的部分,kotlin提供了 中缀表达式和普通的函数方法调用。
val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)
/**
* 交集
*/
@Test
fun testIntersect() {
val i1 = o1 intersect o2
val i2 = o1.intersect(o2)
println(i1 == i2)
println(i1)
}
结果是:
true
[2]
其中o1 intersect o2
是中缀表达式,很强大的东西,有兴趣的同学可以去了解下,从语义上来讲,我觉得比方法调用更加直观。
并集的意思就是将多个集合合并后去重,kotlin 提供了 3 种方法获取:中缀表达式、方法符重载、普通方法
val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)
/**
* 并集
*/
@Test
fun testUnion() {
val u1 = o1 + o2
val u2 = o1 union o2
var u3 = o1.union(o2)
println(u1 == u2)
println(u1 == u3)
println(u2)
}
结果为:
true
true
[1, 2, 4, 3, 6]
其中o1+o2
是对+
进行了重载,通过 IDE 可以点击过去查看其实现:
public operator fun <T> Set<T>.plus(elements: Iterable<T>): Set<T> {
val result = LinkedHashSet<T>(mapCapacity(elements.collectionSizeOrNull()?.let { this.size + it } ?: this.size * 2))
result.addAll(this)
result.addAll(elements)
return result
}
这个就是通过扩展函数对+(plus)
进行了符号重载,学过 C++
的应该很明白这种用法。传统的 Java
可是没有这个利器的。
差集的定义简单来讲,就是元素存在于集合 A中而不存在于 B中。也可以理解为:A集合排除(A和 B 的交集)
直接上代码
val o1 = setOf(1, 2, 4)
var o2 = setOf(2, 3, 6)
/**
* 差集
*/
@Test
fun testSubtract() {
val s1 = o1 - o2
val s2 = o1.subtract(o2)
val s3 = o1 subtract o2
println(s1 == s2)
println(s3 == s2)
println(s3)
println(s3)
}
结果
true
true
[1, 4]
[1, 4]
也是有 3 种表达的方式:符号重载、中缀表达式、普通方法调用。
进了 kotlin
的门,你还出的去吗?