如果对象不为空,则创建 运行 函数的扩展

Create extension that run a function if object is not null

我可以使用 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 }

是的,你可以。

要么使用函数引用

maybeNullInt?.runIfNotNull(::doSomething)

或在 lambda 中传递参数

maybeNullInt?.runIfNotNull { doSomething(it) }

您可以使用 Kotlin 标准库中的 let 函数,而不是创建您自己的扩展函数:

maybeNullInt?.let(::doSomething)

:: - 在 Kotlin 中,我们使用此运算符按名称引用函数。

basically I want to do this maybeNullInt?.runIfNotNull { doSomething }

您已经可以使用 ?.let(或 ?.run):

maybeNullInt?.let(::doSomething)

您不能写成 { doSomething },因为它的意思完全不同。有关 :: 语法的说明,请参阅 https://kotlinlang.org/docs/reference/reflection.html#callable-references

如果你定义 runIfNotNull 你实际上可以在没有 ? 的情况下使用它:

maybeNullInt.runIfNotNull(::doSomething)

(如果 maybeNullIntnull,则不执行任何操作)。