有没有一种方法,无需使用中间映射,即可反转一对多关联?
例如:我有以下对象:
data class Change(val dependencies: Collection<Revision>)
如果我有一个
Change
对象列表,我可以使用 changes.associateWith { it.dependencies }
轻松生成映射,但是如果我想将依赖项映射到等待它们的所有更改,该怎么办?
目前我正在诉诸使用中间体
MutableMap
,但我希望将其全部发送到标准Map
。
关于
MutableMap
,所有从现有集合创建新地图的内置方法(例如associateWith
)都利用底层的中间MutableMap
来构造新地图。 不使用MutableMap
将意味着创建很多中间不可变映射,这将分配相当多的内存。
我假设您的意思是您不想看到任何
MutableMap
出现在您的代码中。
想法是这样的:将映射“扁平化”为修订和更改对的集合 (Pair<Revision, Change>
),然后按修订对这些对进行分组。
fun transform(changes: Map<Change, List<Revision>>) =
changes.flatMap { (change, deps) -> deps.map { it to change } }
.groupBy({ it.first }) { it.second }
或者如果您有 Change
的集合:
fun transform(changes: Iterable<Change>) =
changes.flatMap { change ->
change.dependencies.map { it to change }
}.groupBy({ it.first }) { it.second }
}
如果您不想为每个更改创建新的 asSequence
,请考虑在
map
之前添加
List
。也就是说,这仍然会产生大量
Pair
,并且可能会比现有解决方案占用更多内存。