Kotlin 传递函数作为参数与 lambda 实现

Kotlin pass function as a parameter vs lambda implementation

我正在使用 io.reactivex.rxkotlin 扩展函数:

fun <T : Any> Observable<T>.subscribeBy(
        onError: (Throwable) -> Unit = onErrorStub,
        onComplete: () -> Unit = onCompleteStub,
        onNext: (T) -> Unit = onNextStub
        ): Disposable

当我使用这个扩展时,如果我选择发送参数或者如果我使用 lambda 是不同的。 例如

第一次实施:

myObservable.subscribeBy { str ->
    // onNext
}

第二次执行:

myObservable.subscribeBy({ throwable ->
    // onError
})

我不确定为什么。

subscribeBy方法的优点是命名参数,可以解决所有问题。

可以观察到,使用lambda表示法设置了最后一个未命名参数,而直接设置参数设置了第一个未命名参数。

如果您命名其中一个参数,您将无法再使用 lambda 表示法。

来自Higher-Order Functions and Lambdas

In Kotlin, there is a convention that if the last parameter of a function accepts a function, a lambda expression that is passed as the corresponding argument can be placed outside the parentheses:

所以在你的例子中,你有一个带有三个可选参数的函数。在第一个实现中:

myObservable.subscribeBy { str -> }

您正在使用此功能来省略 last lambda 参数(即 onNext)的括号。但是,当您使用第二个实现时:

myObservable.subscribeBy({ throwable -> })

因为它在括号内,所以它必须是第一个参数,除非您明确将其命名为最后一个参数,例如:

myObservable.subscribeBy(onNext = { str -> })