我确定,我的代码返回的值不是空值:
fun getBitmap(id: Int): Bitmap{
if (!(id in bitmapStorage))
bitmapStorage.put(id, BitmapFactory.decodeResource(resources, id))
return bitmapStorage.get(id)
}
返回Bitmap
类型而不是Bitmap?
的正确方法是什么?
!!
,as Bitmap
还是其他?
答案 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()!!。