Что было бы самым кратким способом использования with
iff a var
не null
?Kotlin With If Not Null
Лучшее, что я мог придумать это:
arg?.let { with(it) {
}}
Что было бы самым кратким способом использования with
iff a var
не null
?Kotlin With If Not Null
Лучшее, что я мог придумать это:
arg?.let { with(it) {
}}
Вы можете использовать функции расширения Котлин apply()
или run()
в зависимости от хотите ли вы быть бегло (возвращение this
в конце) или Трансформер мина (возвращает новое значение в конце):
Использование для apply
:
something?.apply {
// this is now the non-null arg
}
И беглом Например:
user?.apply {
name = "Fred"
age = 31
}?.updateUserInfo()
Преобразуя пример использования run
:
val companyName = user?.run {
saveUser()
fetchUserCompany()
}?.name ?: "unknown company"
В качестве альтернативы, если вам не нравится, что именование и действительно хотите функция называется with()
вы можете легко создать свою собственную многоразовую функцию:
// returning the same value fluently
inline fun <T: Any> T.with(func: T.() -> Unit): T = this.apply(func)
// or returning a new value
inline fun <T: Any, R: Any> T.with(func: T.() -> R): R = this.func()
Пример использование:
something?.with {
// this is now the non-null arg
}
Если вам нужна нулевая проверка, встроенная в функцию, возможно, функция withNotNull
?
// version returning `this` or `null` fluently
inline fun <T: Any> T?.withNotNull(func: T.() -> Unit): T? =
this?.apply(func)
// version returning new value or `null`
inline fun <T: Any, R: Any> T?.withNotNull(thenDo: T.() -> R?): R? =
this?.thenDo()
Пример использования:
something.withNotNull {
// this is now the non-null arg
}
Смотрите также:
Any
Удивительный! Я все больше люблю Люблю Котлина каждый раз, когда вижу что-то подобное. – Eliezer
Похоже, альтернатива, которая будет использовать:
arg?.run {
}
'it' уже не является нулевым, потому что вы используете' arg? .Let {} ' –
Да, но дело в том, что я хочу использовать' with' с ненулевым значением. Я хочу использовать 'with' для своей области. – Eliezer