В чем разница между фигурными скобками и обычными скобками в RxJava с Kotlin

Я не понимаю реальной разницы между фигурными скобками и и нормальными скобками в Котлине при использовании RxJava. Например, у меня есть следующий код, который работает, как ожидалось:

someMethodThatReturnsCompletable()
    .andThen(anotherMethodThatReturnsACompletable())
    .subscribe(...)

но следующее не работает:

someMethodThatReturnsCompletable()
    .andThen { anotherMethodThatReturnsACompletable() }
    .subscribe(...)

обратите внимание на разницу в andThen() часть цепи с фигурными скобками. Я не могу понять, в чем разница между ними. Я посмотрел на некоторые статьи, но, к сожалению, у меня все еще есть трудно понять это тонкое различие.

4 ответов


первый сегмент кода выполняется anotherMethodThatReturnsACompletable() и передает возвращаемое значение andThen(), где a Completable принимается в качестве параметра.

во втором сегменте кода Вы пишете литерал функции как лямбда-выражение. Он передает функцию типа () -> Unit to andThen(), что также является допустимым утверждением, но код внутри лямбды не может быть вызван.

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

lock (lock) {
    sharedResource.operation()
}

С поддержкой Котлин Сэм преобразования,

это означает, что литералы функций Kotlin могут быть автоматически преобразованы в реализации интерфейсов Java с помощью одного нестандартного метода, если типы параметров метода интерфейса соответствуют типам параметров Kotlin функция.

оглядываясь на Completable, есть несколько перегруженных andThen() функции:

andThen(CompletableSource next)
andThen(MaybeSource<T> next)
andThen(ObservableSource<T> next)
andThen(org.reactivestreams.Publisher<T> next)
andThen(SingleSource<T> next)

здесь вы можете указать тип SAM, позвонив:

andThen( CompletableSource {
    //implementations
})

как вы, вероятно, знаете, что в Java () скобки используются для передачи параметров и {} фигурные скобки используются для тела метода, а также представляют тело лямбда-выражения.

Итак, давайте сравним:

  1. .andThen(anotherMethodThatReturnsACompletable()) : здесь и() метод принимает Completable таким образом, andThen сохранит ссылку на completable, возвращенную anotherMethodThatReturnsACompletable() способ подписки позже.

  2. .andThen { anotherMethodThatReturnsACompletable() }: Это передает лямбда-выражение в andThen метод. Вот!--4--> не вызывается во время передачи лямбды. anotherMethodThatReturnsACompletable() будет вызываться при вызове лямбда-функции в методе andThen.

надеюсь, что это помогает.


.andThen(anotherMethodThatReturnsACompletable()) означает, что результат anotherMethodThatReturnsACompletable() будет передана andThen()

.andThen { anotherMethodThatReturnsACompletable() } означает, что лямбда, которая выполняет anotherMethodThatReturnsACompletable() будет передана andThen()


() -> вы передаете что-то внутри них, т. е. аргументов функции

{} - > вы выполняете что-то внутри них. то есть выражение