【问题标题】:Kotlin pass function as a parameter vs lambda implementationKotlin 传递函数作为参数 vs lambda 实现
【发布时间】:2025-12-28 19:15:13
【问题描述】:

我正在使用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
})
  • 第一个实现中,函数是onNext
  • 第二个实现中,函数是onError

我不知道为什么。

【问题讨论】:

    标签: kotlin kotlin-extension rx-kotlin


    【解决方案1】:

    来自Higher-Order Functions and Lambdas

    在 Kotlin 中,有一个约定,如果函数的最后一个参数接受一个函数,则作为相应参数传递的 lambda 表达式可以放在括号外:

    因此,在您的情况下,您有一个带有三个可选参数的函数。在第一个实现中:

    myObservable.subscribeBy { str -> }
    

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

    myObservable.subscribeBy({ throwable -> })
    

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

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

    【讨论】:

    • 我之前用过subscribeBy,但我没有得到这个扩展功能与subscribe本身相比有什么好处?!
    【解决方案2】:

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

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

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

    【讨论】: