克隆MutableMap的惯用方法是什么?

时间:2016-12-01 17:26:38

标签: kotlin

我有一个名为translations的MutableMap。我想将其克隆到另一个MutableMap或Map中。我使用以下内容完成了此操作:translations.map { it.key to it.value }.toMap()

这对我来说并不“合适”。有没有更惯用的方法来克隆MutableMap?

3 个答案:

答案 0 :(得分:2)

Kotlin 1.0.x标准库没有定义复制地图的惯用方法。一个更多惯用的方式是map.toList().toMap(),但有时在Kotlin中做某事的大多数惯用方法是简单地定义你自己的extensions。 e.g:

fun <K, V> Map<K, V>.toMap(): Map<K, V> = when (size) {
    0 -> emptyMap()
    1 -> with(entries.iterator().next()) { Collections.singletonMap(key, value) }
    else -> toMutableMap()
}

fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> = LinkedHashMap(this)

上述扩展功能与release 1.1-M03 (EAP-3)中定义的功能非常相似。

来自kotlin/Maps.kt at v1.1-M03 · JetBrains/kotlin

/**
 * Returns a new read-only map containing all key-value pairs from the original map.
 *
 * The returned map preserves the entry iteration order of the original map.
 */
@SinceKotlin("1.1")
public fun <K, V> Map<out K, V>.toMap(): Map<K, V> = when (size) {
    0 -> emptyMap()
    1 -> toSingletonMap()
    else -> toMutableMap()
}

/**
 * Returns a new mutable map containing all key-value pairs from the original map.
 *
 * The returned map preserves the entry iteration order of the original map.
 */
@SinceKotlin("1.1")
public fun <K, V> Map<out K, V>.toMutableMap(): MutableMap<K, V> = LinkedHashMap(this)

答案 1 :(得分:1)

预期的方式是translations.toMutableMap()。不幸的是,它不保留地图的性质,这意味着生成的类将取决于实现。

答案 2 :(得分:0)

你可以试试这个:

yourMap.toMap().toMutableMap()

这里是扩展函数:

MutableMap<K, V>.copy() = this.toMap().toMutableMap()