如何从 Kotlin 中的函数返回布尔值

ume*_*esh 1 yaml kotlin kotlin-extension

我是科特林的新手。我正在 kotlin 程序中从属性文件中读取键和值。但是我不知道如何直接返回一个键的值。请在下面找到 application.yml 和 abc.class(这是一个 kotlin 类)。

应用程序.yml

abcconfig:
  isabcEnabled:
    default: false
    xyz: true
    def: true
Run Code Online (Sandbox Code Playgroud)

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
    }

}
Run Code Online (Sandbox Code Playgroud)

gid*_*dds 5

这是关于可空性的。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
}
Run Code Online (Sandbox Code Playgroud)

甚至(为了更好的线程安全以及简洁和清晰):

fun getabcEnabledValue(siteId: String?)
    = abcEnabled[siteId] ?: abcEnabled["default"] ?: false
Run Code Online (Sandbox Code Playgroud)

或者,如果您想null在这种情况下返回,只需将函数声明为返回Boolean?(允许为 null)——或者?: false在最后一个示例中省略 。

(另外,作为一个风格问题,我不确定你为什么要创建abcEnabled一个私有属性然后添加自己的 setter。是否真的有必要隐藏 getter?如果没有,公共属性会更简单。而且它是可能值得使abc方法名称中的大小写一致。)