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

时间:2019-03-15 06:56:19

标签: kotlin yaml kotlin-extension

我是科特林的新手。 我正在从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
    }

}

1 个答案:

答案 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的大小写保持一致。)