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 になっている。 これで意図通りの結果が得られた。