如何解决带有哈希映射键的智能投射
我正在将一些Java应用程序移植到Kotlin,并且我一直在使用hashmaps遇到此问题。假设我有两个哈希图:
var firstHashmap: HashMap<String,String> = hashMapOf("foo" to "A","bar" to "B")
var secondHashmap: HashMap<String,String> = hashMapOf("foo" to "C","bar" to "D")
如果另一个密钥中存在相同的密钥,我想更新一个密钥
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"]
}
Kotlin无法编译第二行,因为不能保证firstHashmap
具有“ foo”键。没关系,我只是在第一行对其进行了检查-智能投射系统显然不适用于哈希映射键。这有相同的问题:
if (firstHashmap.containsKey("foo")) {
secondHashmap["foo"] = firstHashmap["foo"]
}
这可行,但是在某些情况下创建额外的变量会很麻烦:
val newValue = firstHashmap["foo"]
if (newValue != null) {
secondHashmap["foo"] = newValue
}
这也有效,但是到目前为止,我从未使用过!!
修饰符:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"]!!
}
这是可行的,但是Elvis运算符之后的默认值将永远不会被使用,并且只能满足编译器的需求,这是错误的:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"] ?: ""
}
更进一步,我尝试使用条件运算而仅使用Elvis运算符,但随后它卡在secondHashMap
上而没有保证的密钥:
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"]
这样就可以了,但这使我回到添加默认值的目的只是为了欺骗编译器:
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"] ?: ""
是否有更好的方法来处理此问题,例如触发智能投射系统以知道密钥确实存在的某种方法?否则,我猜想!!
选项似乎是最干净的,尤其是从上一行很清楚为什么我选择使用它的时候。
解决方法
不能保证#include <stdio.h>
int main(int argc,char* argv[]) {
int j = (int) argv[1];
printf("* j = %d\n",j);
return 0;
}
每次被调用时都会返回相同的值。智能转换仅限于保证不会更改的事物,例如firstHashmap["foo"]
在本地模块中没有自定义获取器。
您可以使用
val
仅在firstHashmap["foo"]?.let {
secondHashmap["foo"] = it
}
上设置不为空的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。