следующая ситуация: я пытаюсь реализовать универсальную функцию, которая проверяет, все ли списки переменных не равны NULL, и выполняет лямбду, для которой требуются переменные, не допускающие значения NULL.
Я могу объединить несколько вызовов letили реализовать несколько 'safeLet' -функций с 2,3,4 ... аргументами, но я все еще надеюсь, что возможна одна универсальная функция со списком.
Здесь текущий код с цепочками вызовов let:
val parameters = call.receiveParameters()
val firstName = parameters["firstName"]
val lastName = parameters["lastName"]
firstName?.let {
lastName?.let { userService.add(UserDTO(firstName = firstName, lastName = lastName)) }
}
Вот моя текущая функция 'safeLet':
fun <T> List<Any?>.safeLet(block: () -> T) {
if(this.contains(null)) return
block()
}
Но следующее по-прежнему не компилируется (поскольку параметры UserDTO являются String, а не String?):
listOf(firstName, lastName).safeLet {
userService.add(UserDTO(firstName = firstName, lastName = lastName))
}
Я могу добавить! после firstName и lastName, чтобы избежать нулевой проверки, но это ужасно.
Моя идея - использовать контракты kotlin. Возможно ли что-то вроде этого:
@ExperimentalContracts
fun <T> List<Any?>.safeLet(block: () -> T) {
contract {
returnsNotNull() implies {ALL ELEMENTS ARE NOT NULLABLE}
}
if(this.contains(null)) return
block()
}
Заранее спасибо.
По поводу комментария "filterNotNull" я сейчас попробовал это. Все еще не идеально, потому что я не люблю использовать здесь это [0] и это [1], но это работает:
allNotNull(firstName, lastName)?.apply {
userService.add(UserDTO(firstName = this[0], lastName = this[1]))
}
fun <T : Any> allNotNull(vararg elements: T?): List<T>? = if(elements.contains(null)) null else elements.filterNotNull()