我想找到a
、b
和c
的交集。由于我想在将来向lst
-object 添加更多集合,因此我将其定义为 MutableList。
var a = mutableSetOf(1, 2, 3)
var b = mutableSetOf(2, 3, 4)
var c = mutableSetOf(3, 4, 5)
var lst = mutableListOf(a, b, c)
var intersection = lst.reduce {
acc, currSet -> acc.intersect(currSet)
}
但是,由于类型推断失败,最后一个表达式引发"无效"。(检查这个游乐场(
从文档中,我有以下reduce
操作签名:
inline fun <S, T : S> Iterable<T>.reduce(
operation: (acc: S, T) -> S
): S
那么为什么S
和T
不能属于同一类型呢?
为什么在这里需要使用"可变"类型?它将适用于不可变的集合:
val a = setOf(1, 2, 3)
val b = setOf(2, 3, 4)
val c = setOf(3, 4, 5)
val lst = listOf(a, b, c)
val intersection = lst.reduce { acc, currSet ->
acc.intersect(currSet)
}
问题是intersect
返回一个Set
,而不是一个MutableSet
,这使得类型检查不满意。可通过在reduce
lambda 中使用acc.intersect(currSet).toMutableSet()
或更改为acc: Set<Int>
来修复。我总是使用不可变类型,并且更喜欢我上面发布的代码。
Nit:更喜欢val
而不是var
。