2016-11-04 16 views
4

Что было бы самым кратким способом использования with iff a var не null?Kotlin With If Not Null

Лучшее, что я мог придумать это:

arg?.let { with(it) { 

}} 
+0

'it' уже не является нулевым, потому что вы используете' arg? .Let {} ' –

+0

Да, но дело в том, что я хочу использовать' with' с ненулевым значением. Я хочу использовать 'with' для своей области. – Eliezer

ответ

15

Вы можете использовать функции расширения Котлин 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 
} 

Смотрите также:

+1

Удивительный! Я все больше люблю Люблю Котлина каждый раз, когда вижу что-то подобное. – Eliezer

2

Похоже, альтернатива, которая будет использовать:

arg?.run { 

}