マップ固有の操作
マップでは、キーと値の両方の型がユーザー定義です。 マップのエントリに対するキーベースのアクセスにより、キーによる値の取得からキーと値の個別のフィルタリングまで、さまざまなマップ固有の処理機能が可能になります。 このページでは、標準ライブラリのマップ処理関数について説明します。
キーと値の取得
マップから値を取得するには、get()関数の引数としてそのキーを指定する必要があります。 短縮形である[key]構文もサポートされています。指定されたキーが見つからない場合はnullを返します。 また、getValue()関数もあり、これは動作がわずかに異なります。キーがマップに見つからない場合、例外をスローします。 さらに、キーが存在しない場合を処理するための2つのオプションがあります。
getOrElse()はリストの場合と同じように動作します。存在しないキーに対する値は、指定されたラムダ関数から返されます。getOrDefault()は、キーが見つからない場合に指定されたデフォルト値を返します。
fun main() {
val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
println(numbersMap.get("one"))
println(numbersMap["one"])
println(numbersMap.getOrDefault("four", 10))
println(numbersMap["five"]) // null
//numbersMap.getValue("six") // exception!
}マップのすべてのキーまたはすべての値に対して操作を実行するには、それぞれkeysプロパティとvaluesプロパティからそれらを取得できます。 keysはすべてのマップキーのセットであり、valuesはすべてのマップ値のコレクションです。
fun main() {
val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
println(numbersMap.keys)
println(numbersMap.values)
}フィルタリング
他のコレクションと同様に、filter()関数を使用してマップをフィルタリングできます。 マップでfilter()を呼び出す場合、引数としてPairを受け取る述語を渡します。 これにより、フィルタリング述語でキーと値の両方を使用できます。
fun main() {
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
println(filteredMap)
}マップをフィルタリングするには、キーによるフィルタリングと値によるフィルタリングという2つの特定の方法もあります。 それぞれに対して、filterKeys()とfilterValues()という関数があります。 どちらも、指定された述語に一致するエントリの新しいマップを返します。 filterKeys()の述語は要素のキーのみをチェックし、filterValues()の述語は値のみをチェックします。
fun main() {
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredKeysMap = numbersMap.filterKeys { it.endsWith("1") }
val filteredValuesMap = numbersMap.filterValues { it < 10 }
println(filteredKeysMap)
println(filteredValuesMap)
}Plusおよびminus演算子
要素へのキーアクセスにより、plus (+) および minus (-) 演算子は、他のコレクションとは異なる方法でマップに作用します。 plusは、その両方のオペランドの要素を含むMapを返します。左側のMapと、右側のPairまたは別のMapです。 右側のオペランドに左側のMapに存在するキーを持つエントリが含まれている場合、結果のマップには右側のエントリが含まれます。
fun main() {
val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
println(numbersMap + Pair("four", 4))
println(numbersMap + Pair("one", 10))
println(numbersMap + mapOf("five" to 5, "one" to 11))
}minusは、左側のMapのエントリから、右側のオペランドのキーを持つエントリを除いたMapを作成します。 そのため、右側のオペランドは単一のキー、またはキーのコレクション(リスト、セットなど)のいずれかになります。
fun main() {
val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
println(numbersMap - "one")
println(numbersMap - listOf("two", "four"))
}ミュータブルマップでのplusAssign (+=) および minusAssign (-=) 演算子の使用に関する詳細は、以下の「マップの書き込み操作」を参照してください。
マップの書き込み操作
ミュータブルマップは、マップ固有の書き込み操作を提供します。 これらの操作により、キーベースのアクセスを使用してマップの内容を変更できます。
マップの書き込み操作を定義する特定のルールがいくつかあります。
- 値は更新できます。しかし、キーは決して変更されません。一度エントリを追加すると、そのキーは定数です。
- 各キーには、常に単一の値が関連付けられています。エントリ全体を追加および削除できます。
以下に、ミュータブルマップで利用できる標準ライブラリの書き込み操作関数について説明します。
エントリの追加と更新
ミュータブルマップに新しいキーと値のペアを追加するには、put()を使用します。 新しいエントリがLinkedHashMap(デフォルトのマップ実装)に追加されると、マップをイテレートする際に最後にくるように追加されます。ソートされたマップでは、新しい要素の位置はキーの順序によって定義されます。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap.put("three", 3)
println(numbersMap)
}一度に複数のエントリを追加するには、putAll()を使用します。 その引数には、MapまたはPairのグループ(Iterable、Sequence、Arrayなど)を指定できます。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
numbersMap.putAll(setOf("four" to 4, "five" to 5))
println(numbersMap)
}put()とputAll()の両方は、指定されたキーがマップに既に存在する場合、値を上書きします。したがって、これらを使用してマップエントリの値を更新できます。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
val previousValue = numbersMap.put("one", 11)
println("value associated with 'one', before: $previousValue, after: ${numbersMap["one"]}")
println(numbersMap)
}短縮形の演算子形式を使用してマップに新しいエントリを追加することもできます。これには2つの方法があります。
plusAssign(+=) 演算子。set()のエイリアスである[]演算子。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2)
numbersMap["three"] = 3 // calls numbersMap.put("three", 3)
numbersMap += mapOf("four" to 4, "five" to 5)
println(numbersMap)
}マップに存在するキーで呼び出された場合、演算子は対応するエントリの値を上書きします。
エントリの削除
ミュータブルマップからエントリを削除するには、remove()関数を使用します。 remove()を呼び出す際、キーまたはキーと値のペア全体を渡すことができます。 キーと値の両方を指定した場合、そのキーを持つ要素は、その値が2番目の引数と一致する場合にのみ削除されます。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
numbersMap.remove("one")
println(numbersMap)
numbersMap.remove("three", 4) //doesn't remove anything
println(numbersMap)
}ミュータブルマップからエントリをキーまたは値で削除することもできます。 これを行うには、マップのキーまたは値に対してremove()を呼び出し、エントリのキーまたは値を指定します。 値に対して呼び出された場合、remove()は指定された値を持つ最初のエントリのみを削除します。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3)
numbersMap.keys.remove("one")
println(numbersMap)
numbersMap.values.remove(3)
println(numbersMap)
}minusAssign (-=) 演算子もミュータブルマップで利用できます。
fun main() {
val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
numbersMap -= "two"
println(numbersMap)
numbersMap -= "five" //doesn't remove anything
println(numbersMap)
}