Часто у меня есть выражение, которое начинается с коллекции, допускающей значение 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 вернет ненулевое значение).
Как я могу написать такую функцию?