如果我有一个immutableMap: Map<String, Int>
并想将其转换为mutableMap: MutableMap<String, Int>
,那么最好的方法是什么?似乎没有任何方便的方法。将不可变映射文件复制到Kotlin中的可变映射文件中
8
A
回答
6
以下扩展功能的工作原理是将Map
复制到MutableMap
。
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
9
首先,在覆盖前面的问题有关科特林只读集合及其不变性,他们是真正的只读生活意见可能可变集合的。
科特林可以安全地检查可变性的类型,这些因为有上,让科特林知道接口标记,例如:
// assuming some variable readOnlyMap of type Map<String, String>
val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) {
readOnlyMap as MutableMap
} else {
HashMap(readOnlyMap)
}
这is
检查内部调用TypeIntrinsics.isMutableMap
,是一个有效的办法知道它是否可浇铸。如果您先进行此项检查,演员阵容中没有危险。你会注意到编译器非常高兴,没有警告。如果您不打算修改被视为只读的相同地图,但显示可以施展影响,则这可能很危险。
如果你不想修改原始地图的机会,那么当然总是通过用另一个地图HashMap(readOnlyMap)
调用HashMap的构造函数来复制副本。或进行扩展功能:
fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this)
,并称之为:
val mutableMap = readOnlyMap.toMutableCopy()
现在你有你的简单方法。
参见:
相关问题
- 1. 可变的多重映射到不可变的映射
- 2. 将可执行文件中的变量映射到内存段
- 3. 在SBT中映射的文件不会复制到类目录
- 4. 映射文件中的Hibernate'Inverse'
- 5. 在Java代码中将Java映射转换为Scala不可变映射
- 6. RestKit映射错误“无法将对象集合映射到不可变集合。”
- 7. 内存映射文件 - 映射结构而不是文件?
- 8. terraform可以使用可变散列或映射或映射在.tf文件中创建数据条目吗?
- 9. 文件的可视化映射
- 10. 高效的不可变映射实现?
- 11. 可以将映射映射为0吗?
- 12. 将数据库结构映射到nHibernate映射文件
- 13. 使用构建器(使用immutables注释处理器)将映射对象映射到不可变对象映射
- 14. 使用映射突变可变集合?
- 15. 映射MARC文件
- 16. Maven映射文件
- 17. 映射不可改变性冬眠
- 18. ASP.NET - 将文件复制到映射的网络驱动器
- 19. 在Scala中将Seq的可变Map转换为IndexedSeq的不可变映射
- 20. 如何在映射在informatica中运行映射时将数据复制到一个excel文件中?
- 21. 映射变量
- 22. NGINX - 将html文件映射到php
- 23. 将JSON文件映射到MySQL
- 24. 将ProGuard映射文件上传到Firebase
- 25. 文本文件映射
- 26. mappingResources找不到映射文件
- 27. 不可变对象的Hibernate组件映射
- 28. 的nHibernate映射文件
- 29. 可以将TTURLMap从three20映射到xib文件吗?
- 30. 将textid映射到文本
我认为你应该明确指定HashMap的泛型,否则你最终会得到一个带有平台键/值类型的映射。 –
我建议不要'MutableMap'检查,因为它可以返回真正的Java集合,这些集合实际上并不可变。例如,尝试'Collections.unmodifiableMap(mutableMapOf(“a”到“b”))是MutableMap <*,*>'。 –
这看起来对我来说是最好的答案。你可能会添加一个例子,它不直接使用HashMap(我相信'mutableMapOf'实际上使用'LinkedHashMap')。例如:'val mutableMap = map.entries.associateTo(mutableMapOf()){entry - > entry.toPair()}'。 – mfulton26