我正在学习KotlinMultiplatform,并试图将我的一个玩具项目(最初是为JVM编写的)迁移到Kotlin Native。有一件事我一直在使用Java方法Map.merge:
@Test
fun usingMerge() {
val map = mutableMapOf("A" to 42, "B" to 13)
map.merge("A", 20, ::max)
map.merge("B", 15, ::max)
map.merge("C", 10, ::max)
val expected = mapOf("A" to 42, "B" to 15, "C" to 10)
assertEquals(expected, map)
}
由于这个Java方法在KotlinNative中不可用,我试图找到一个合适的替代方法。我所得到的代码太冗长,效率太低:
@Test
fun withoutMerge() {
val map = mutableMapOf("A" to 42, "B" to 13)
map["A"].also { if (it == null || it < 20) map["A"] = 20 }
map["B"].also { if (it == null || it < 15) map["B"] = 15 }
map["C"].also { if (it == null || it < 10) map["C"] = 10 }
val expected = mapOf("A" to 42, "B" to 15, "C" to 10)
assertEquals(expected, map)
}
有没有一种方法可以写得更短(接近merge
的简洁程度),没有重复(例如,在上面的代码中,“A”和20重复了两次),并且不对同一个键执行两次查找?
2条答案
按热度按时间pu82cl6c1#
您可以在MutableMap接口上将自己的merge编写为纯Kotlinextension function。
这对你的例子很有效,当然泛型会更复杂一些:
1bqhqjot2#