Функция прохода Котлина как параметр против лямбда-реализации - PullRequest
0 голосов
/ 19 марта 2019

Я использую функцию расширения io.reactivex.rxkotlin:

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

И когда я использую это расширение, есть разница, если я решу отправить параметр или я использую лямбду. Например

первая реализация:

myObservable.subscribeBy { str ->
    // onNext
}

Вторая реализация:

myObservable.subscribeBy({ throwable ->
    // onError
})
  • в первой реализации функция onNext
  • и во второй реализации функция onError

И я не уверен почему.

Ответы [ 2 ]

7 голосов
/ 19 марта 2019

С Функции высшего порядка и лямбда-выражения :

В Котлине существует соглашение, согласно которому, если последний параметр функции принимает функцию, лямбда-выражение, котороепереданный в качестве соответствующего аргумента может быть помещен за скобки:

Так что в вашем случае у вас есть функция, которая принимает три необязательных параметра.В первой реализации:

myObservable.subscribeBy { str -> }

Вы используете эту функцию, чтобы исключить скобки для последнего лямбда-параметра (то есть onNext).Однако, когда вы используете вторую реализацию:

myObservable.subscribeBy({ throwable -> })

Так как он находится в скобках, он должен быть первым параметром, если вы не указали его явно в качестве последнего параметра, например:

myObservable.subscribeBy(onNext = { str -> })
1 голос
/ 19 марта 2019

Метод subscribeBy имеет преимущество именованных параметров, что решит все проблемы.

Вы можете заметить, что с помощью лямбда-нотации задается последний безымянный параметр, а при установке параметра напрямую устанавливается первый безымянный параметр.

Если вы назовете один из параметров, вы больше не сможете использовать лямбда-нотацию.

...