我是科特林的新手。 我正在从Kotlin程序的属性文件中读取键和值。但是我不知道如何直接返回键的值。 请在下面找到application.yml和abc.class(这是一个kotlin类)。
application.yml
abcconfig:
isabcEnabled:
default: false
xyz: true
def: true
abc.class
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component
@Component
@ConfigurationProperties(prefix = "abcconfig")
class AbcConfig {
private var abcEnabled: Map<String, Boolean> = mutableMapOf()
fun getabcEnabledValue(siteId: String?): Boolean {
val abc: Boolean
val key: String? = if (abcEnabled.containsKey(key)) key else "default"
abc = abcEnabled[key]
return abc
}
fun setAbcEnabled(abcEnabled: Map<String, Boolean>) {
this.abcEnabled = abcEnabled
}
}
答案 0 :(得分:3)
这与可空性有关。 Kotlin编译器会跟踪每个值是否可以为null,并阻止您执行不安全的事情。
此问题中的代码有一个特定的可空性问题。 (它也有些混乱,在设置之前包括对key
的两个引用。我假设它们应该是siteId
。)
问题是abcEnabled
映射不包含请求的密钥时会发生什么。如果存在密钥,则[…]
运算符将返回相应的Boolean
值;但是如果键不存在(如果地图不包含“默认”键,则可能会发生),则返回null。但是,您尝试将其分配给的变量的类型为Boolean
,该变量不允许为空。这就是编译器抱怨的原因。
因此,如果地图不包含“默认”键,则必须决定要发生的事情。 (或者找到一种方法来确保总是能够做到;但是要困难得多,特别是如果可以在对象完全初始化之前,或者在另一个线程正在设置或更新地图时调用该方法。优雅地处理此案更加安全。)
在这种情况下,如果您想返回false
,则代码可以归结为:
fun getabcEnabledValue(siteId: String?): Boolean {
val key: String? = if (abcEnabled.containsKey(siteId)) siteId else "default"
return abcEnabled[key] ?: false
}
甚至(为了更好的线程安全性和简洁性):
fun getabcEnabledValue(siteId: String?)
= abcEnabled[siteId] ?: abcEnabled["default"] ?: false
或者,如果您想在这种情况下返回null
,只需将函数声明为返回Boolean?
(允许为空),或者在上一个示例中省略?: false
。 / p>
(此外,出于风格考虑,我不确定您为什么将abcEnabled
设为私有财产,然后添加自己的设置器。真的有必要隐藏吸气剂吗?公共属性会更简单。而且值得在方法名称中将abc
的大小写保持一致。)