在Kotlin中将不可变的地图复制到可变的地图
如果我有一个immutableMap: Map<String, Int>
并想将其转换为mutableMap: MutableMap<String, Int>
,那么最好的办法是什么? 似乎没有任何方便的方法。
首先,正如前面关于Kotlin只读集合及其不可变性的问题所涵盖的,它们实际上只是读取可能的可变集合的实时视图。
Kotlin可以安全地检查这些类型的可变性,因为在Kotlin知道的接口上有标记,例如:
// 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
是一个有效的方法来知道它是否可转换。 如果你先做这个检查,那么演员就没有危险了。 你会注意到编译器是完美的,没有警告。 如果您不打算修改被视为只读的相同地图,但是显示您可以施展影响,则这可能很危险。
如果你不想修改原始地图的机会,那么当然总是通过用另一个Map, HashMap(readOnlyMap)
调用HashMap的构造函数来复制副本。 或者做一个扩展功能:
fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this)
并称之为:
val mutableMap = readOnlyMap.toMutableCopy()
现在你有了简单的方法。
也可以看看:
- Kotlin和不可变的收藏?
- 如何把一个可变集合变成一个不可变的集合
- Kotlin编辑列表
- Kotlin实例化不可变列表
- Klutter库不可变的包装器
下面的扩展函数通过将Map
复制到MutableMap
。
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> { return HashMap(this) }
- decimalFormat.format()错误
- Kotlin构造函数:小学和中学
- Android Room:查询中的每个绑定变量都必须具有匹配的方法
- 由自定义视图中的懒惰Kotlin
- 图像存在,不为空,但我得到一个NullPointerExceptionexception
- 从1.0.2 – 1.0.3升级Kotlin:java.lang.NoSuchMethodError:没有虚方法provideInjectedData $ app_compileDebugKotlin()
- @StringRes,@DrawableRes,@LayoutRes等android注释lint检查与kotlin参数
- 扇出/扇入结果通道
- 无尽的RecyclerView数据加载逻辑在所有设备上都不一致