Вернуть тип, не допускающий значения NULL - PullRequest
3 голосов
/ 29 мая 2020

Я уверен, что мой код возвращает ненулевое значение:

    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 ]

4 голосов
/ 29 мая 2020

Вы можете использовать оператор !! или API MutableMap - getOrPut, он вернет ненулевой тип

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

Обратите внимание, что операция atomi c не гарантируется, если карта модифицируется одновременно.

1 голос
/ 29 мая 2020

Учитывая операции, которые вы выполняете над bitmapStorage, я предполагаю, что это экземпляр MutableMap. Если это так, я думаю, что есть еще более идиоматический c способ достичь того же результата, и он включает в себя использование getOrPut метода . По сути, он возвращает значение, связанное с данным ключом, если он существует, в противном случае он связывает любое значение, которое вы хотите, с данным ключом и возвращает это значение.

Пример:

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)
}
0 голосов
/ 29 мая 2020

Согласно вашему коду, метод getBitmap () никогда не может вернуть null. В таких случаях вы должны вернуть его как Bitmap (T - тип класса).

Но могут быть случаи, когда метод потенциально может время от времени возвращать null, в таких случаях рекомендуется возвращать его как растровое изображение? (T?)

И вот красота Kotlin становится ярче, вызывающий метод теперь должен явно обрабатывать null. Если вызывающий знает, что он никогда не может быть нулевым, но все же пометил его как T? тогда он / она может назвать это как getBitmap () !!.

Подробнее: https://kotlinlang.org/docs/reference/null-safety.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...