1. 概要

この短いチュートリアルでは、MapのすべてのエントリをKotlinの別のMapにコピーするいくつかの方法を学習します。

2. message

Kotlin 1.1以降、 toMap()拡張関数を使用して、マップのすべてのエントリを別のエントリにコピーできます

val bookInfo = mapOf("name" to "1984", "author" to "Orwell")
val copied = bookInfo.toMap()
assertThat(copied).isNotSameAs(bookInfo)
assertThat(copied).containsAllEntriesOf(bookInfo)

もちろん、コピーが完了した後は、コピーされた Map の内容は不変であるため、変更できません。 コピー後にMapを変更できるようにするために、 toMutableMap()拡張関数を使用できます。

val mutableCopy = bookInfo.toMutableMap();
assertThat(mutableCopy).containsAllEntriesOf(bookInfo)

既存のMapインスタンスに別のインスタンスのコンテンツを入力することもできます。

val destination = mutableMapOf<String, String>()
bookInfo.toMap(destination)
assertThat(destination).containsAllEntriesOf(bookInfo)

上記の例では、別の MaptoMap(map)拡張関数に渡しています。 このようにして、受信側の Map bookInfo )のすべてのエントリを指定されたエントリにコピーします。

Kotlin 1.1より前では、基盤となる Map 実装を直接使用して、同じことを実現できました。 たとえば、ここでは、 java.util.HashMap コンストラクターを使用して、別のMapからすべてをコピーしています。

val copied = java.util.HashMap(bookInfo)
assertThat(copied).containsAllEntriesOf(bookInfo)

これらは指定されたマップの浅いコピーを作成しているだけであることに注意してください。 つまり、2つの Map インスタンスは、 Javaヒープ内の異なるオブジェクトですが、それらの内容は同じオブジェクトです。

assertSame(copied["name"], bookInfo["name"])

3. 結論

このチュートリアルでは、MapのコンテンツをKotlinの別のマップにコピーするいくつかの方法を学びました。

いつものように、すべての例はGitHubから入手できます。