返回非空类型

时间:2020-05-29 08:52:30

标签: kotlin

我确定,我的代码返回的值不是空值:

    fun getBitmap(id: Int): Bitmap{
        if (!(id in bitmapStorage))
            bitmapStorage.put(id, BitmapFactory.decodeResource(resources, id))
        return bitmapStorage.get(id)
    }

返回Bitmap类型而不是Bitmap?的正确方法是什么?

!!as Bitmap还是其他?

3 个答案:

答案 0 :(得分:4)

您可以使用!!运算符或MutableMap的API-getOrPut,它将返回非null类型

fun getBitmap(id: Int): Bitmap{
    return bitmapStorage.getOrPut(id) {BitmapFactory.decodeResource(resources, id)}
}

请注意,如果同时修改地图,则不能保证该操作是原子操作。

答案 1 :(得分:1)

鉴于您正在bitmapStorage上执行的操作,我假设它是MutableMap的实例。如果是这样,我认为还有一种更惯用的方式来获得相同的结果,并且涉及使用getOrPut method。基本上,它将返回与给定键相关联的值(如果存在),否则,它将您想要的任何值与给定键相关联并返回该值。

示例:

val myMap = mutableMapOf<String, String>(
        "key1" to "value1"
)

fun complexMethodToComputeValue(): String {
    // do something complex
    return "I will be called"
}

val value1 = myMap.getOrPut("key1") {
    // this will not be called
    "I won't be called"
}
val value2 = myMap.getOrPut("key2", ::complexMethodToComputeValue)

println(value1)
println(value2)

此打印:

value1
I will be called

因此,回到您的代码,可以将其重写为:

fun getBitmap(id: Int) =  bitmapStorage.getOrPut(id) {
    BitmapFactory.decodeResource(resources, id)
}

答案 2 :(得分:0)

根据您的代码,方法getBitmap()永远不能返回null。在这种情况下,您将其作为位图(T-类的类型)返回。

但是在某些情况下,某个方法有时可能会返回null,在这种情况下,建议将其作为Bitmap返回? (T?)

这就是Kotlin的魅力所在,该方法的调用者现在必须显式处理null。如果呼叫者知道它永远不能为null,但仍将其注释为T?然后,他/她可以将其称为getBitmap()!!。

更多信息:https://kotlinlang.org/docs/reference/null-safety.html