Kotlin: использовать функцию для обработки null перед блоком, подобным `? .Let {}` (поместите значение по умолчанию перед ним) - PullRequest
0 голосов
/ 08 июля 2020

Часто у меня есть выражение, которое начинается с коллекции, допускающей значение NULL, а затем продолжается с помощью не допускающей значения NULL (коллекции, последовательности, итераторы).

Для такого случая я ищу способ установить значение по умолчанию значение перед всем блоком, обрабатывающим элементы.

«Обычный» способ (например):

val mySet: Set<Item> = 
foo.getItems() ?.let { 
    ...
} ?: emptySet()

Единственное место, которое может дать значение null, - это getItems() (это заданный API).

Поскольку блок ... может содержать несколько строк, я хотел бы указать значение по умолчанию перед ним. Что-то вроде:

val mySet: Set<Item> = 
foo.getItems() ?.letOrDefault ( emptySet() ){ 
    ...
}

Мне не хватает очевидного решения?

Я попытался написать такую ​​функцию:

inline fun <T, R> T.letOrDefault(whenNull: R, whenNotNull: (T) -> R): R {
    if (this == null)
        return whenNull
    else
        return whenNotNull(this)
}

Но я не могу получить нулевое значение right - при использовании компилятор дает результат, допускающий значение NULL. Он работал бы с val mySet: Set<Item>? = ..., но это не дает цели :) Я бы хотел, чтобы функция была ограничена возвратом значения, не допускающего значения NULL (таким образом, также whenNull будет ненулевым, а whenNotNull вернет ненулевое значение).

Как я могу написать такую ​​функцию?

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