gpt4 book ai didi

kotlin - 使用 hashmap 键的 Smart Cast

转载 作者:行者123 更新时间:2023-12-02 13:04:36 25 4
gpt4 key购买 nike

我正在将一些 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")
如果另一个 key 存在相同的 key ,我想更新一个:
if (firstHashmap["foo"] != null) {
secondHashmap["foo"] = firstHashmap["foo"]
}
Kotlin 不会编译第二行,因为 firstHashmap不保证有一个“foo”键。我只是在第一行检查它并不重要——智能转换系统显然不适用于 hashmap 键。这有同样的问题:
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 上。没有保证的 key :
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"]
那么这会起作用,但这让我回到添加默认值来欺骗编译器:
secondHashmap["foo"] = firstHashmap["foo"] ?: secondHashmap["foo"] ?: ""
有没有更好的方法来处理这个问题,比如触发智能转换系统以知道 key 真的在那里?否则我猜 !!选项似乎最干净,尤其是当从上一行清楚我选择使用它的原因时。

最佳答案

无法保证 firstHashmap["foo"]每次调用时返回相同的值。智能转换仅限于保证不会改变的东西,例如val在本地模块中没有自定义 getter。
您可以使用

firstHashmap["foo"]?.let {
secondHashmap["foo"] = it
}
仅设置 secondHashmap 上的值如果它不为空。

关于kotlin - 使用 hashmap 键的 Smart Cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64344445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com