Создайте расширение, которое запускает функцию, если объект не нулевой - PullRequest
1 голос
/ 16 марта 2019

Могу ли я иметь функцию расширения kotlin, которая делает что-то вроде этого:

// extension
inline fun <T : Any> T?.runIfNotNull(function: (T) -> Unit) {
    this?.let { function(it) }
}

// some function
fun doSomething(int: Int){
    // do something
}

// doSomething will be called with maybeNullInt as argument, 
// when maybeNullInt is not null
maybeNullInt?.runIfNotNull { doSomething }

в принципе, я хочу заменить

maybeNullInt?.let{ doSomething(it) }

на

maybeNullInt?.runIfNotNull { doSomething }

Ответы [ 3 ]

4 голосов
/ 16 марта 2019

Вместо создания собственной функции расширения вы можете использовать функцию let из стандартной библиотеки Kotlin:

maybeNullInt?.let(::doSomething)

:: - в Kotlin мы используем этот оператор для ссылки на функцию по имени.

3 голосов
/ 16 марта 2019

в основном я хочу сделать это может бытьNullInt? .RunIfNotNull {doSomething}

Вы уже можете с ?.let (или ?.run):

maybeNullInt?.let(::doSomething)

Вы не можете написать { doSomething }, потому что это означало бы что-то совсем другое. См. https://kotlinlang.org/docs/reference/reflection.html#callable-references для объяснения синтаксиса ::.

Если вы определите runIfNotNull, вы можете использовать его без ?:

maybeNullInt.runIfNotNull(::doSomething)

(ничего не делает, если maybeNullInt равно null).

1 голос
/ 16 марта 2019

Да, вы можете.

Либо используйте ссылку на функцию

maybeNullInt?.runIfNotNull(::doSomething)

, либо передайте параметр в лямбду

maybeNullInt?.runIfNotNull { doSomething(it) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...