Home About Contact
Kotlin

HashMap のアイテムから特定のアイテムを取り除く (kotlin)

HashMapを生成して、その中のエントリーの種類に応じて別々の HashMap を生成するためのコード(備忘録)。

まずは一番簡単な例。エントリの value が null だったらそれを取り除く。

hashmap.main.kts:

import java.io.File

// テストする hashMap の生成.
val filesMap = hashMapOf<String, File?>()

filesMap.put("id_1", File("a.txt"))
filesMap.put("id_2", File("b.txt"))
filesMap.put("id_3", null)

println(filesMap)

// null を取り除いた fileMapNotNull という名前の hashMap の生成.
val filesMapNotNull = filesMap.mapNotNull { item->
    if(item.value==null){ null } else { item }
}

println(filesMapNotNull)

実行する。

$ kotlin hashmap.main.kts
{id_1=a.txt, id_3=null, id_2=b.txt}
[id_1=a.txt, id_2=b.txt]

ん?生成されたのは HashMap ではなくリストだ。

println(filesMapNotNull::class)

で調べると class java.util.ArrayList が出力される。

ところで、この item はどんなオブジェクトか調べる。

filesMap.forEach { item->
    println(item::class)
}

これを実行すると class java.util.HashMap$Node が出力された。

つまり、 hashMap.mapNotNull {} するとその結果は List<java.util.HashMap$Node> になるってこと。(当たり前)

ならば普通に filter を使って null なアイテムを取り除けばよいのでは?

val filesMapNotNullDash = filesMap.filter { item->
    item.value!=null
}
println(filesMapNotNullDash)
println(filesMapNotNullDash::class)

filter で実装できた。 結果の filesMapNotNullDash はなんのインスタンスかといえば class java.util.LinkedHashMap になっている。 これで意図通りの結果が得られた。