我正在将一些 Java 应用程序移植到 Kotlin,但我一直在使用哈希图遇到这个问题。假设我有两个哈希图:
var firstHashmap: HashMap<String, String> = hashMapOf("foo" to "A", "bar" to "B")
var secondHashmap: HashMap<String, String> = hashMapOf("foo" to "C", "bar" to "D")
Run Code Online (Sandbox Code Playgroud)
如果另一个中存在相同的密钥,我想更新一个:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"]
}
Run Code Online (Sandbox Code Playgroud)
Kotlin 不会编译第二行,因为firstHashmap不能保证有“foo”键。我只是在第一行检查它并不重要 - 智能转换系统显然不适用于 hashmap 键。这有同样的问题:
if (firstHashmap.containsKey("foo")) {
secondHashmap["foo"] = firstHashmap["foo"]
}
Run Code Online (Sandbox Code Playgroud)
这有效,但在某些情况下创建额外变量会变得混乱:
val newValue = firstHashmap["foo"]
if (newValue != null) {
secondHashmap["foo"] = newValue
}
Run Code Online (Sandbox Code Playgroud)
这也有效,但到目前为止我从未使用过!!修饰符:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"]!!
}
Run Code Online (Sandbox Code Playgroud)
这行得通,但是 Elvis 运算符后面的默认值永远不会被使用,只是为了满足编译器,感觉不对:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"] ?: ""
}
Run Code Online (Sandbox Code Playgroud)
更进一步,我尝试secondHashMap放弃条件并仅使用 Elvis 运算符,但随后它陷入了没有保证密钥的问题:
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"]
Run Code Online (Sandbox Code Playgroud)
那么这会起作用,但这让我回到添加默认值只是为了欺骗编译器:
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"] ?: ""
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个问题,比如某种方式来触发智能投射系统以知道密钥真的存在?否则我猜这个!!选项看起来最干净,尤其是当我从上一行中清楚为什么我选择使用它时。
不能保证firstHashmap["foo"]每次调用时都返回相同的值。智能转换仅限于保证不会更改的内容,例如val在本地模块中没有自定义 getter。
您可以使用
firstHashmap["foo"]?.let {
secondHashmap["foo"] = it
}
Run Code Online (Sandbox Code Playgroud)
仅在secondHashmap它不为空时才设置该值。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |