Какая разница между фигурными скобками и нормальными скобками в RxJava с Котлином

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

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

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

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

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

Ответы

Ответ 1

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

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

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

lock (lock) {
    sharedResource.operation()
}

Поскольку Kotlin поддерживает преобразование SAM,

Это означает, что литералы функции 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
})

Ответ 2

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

Так что давайте сравним:

  1. .andThen(anotherMethodThatReturnsACompletable()): здесь и метод Then() принимает Completable поэтому andThen сохранит ссылку на anotherMethodThatReturnsACompletable() возвращаемый методом anotherMethodThatReturnsACompletable() чтобы позже подписаться.

  2. .andThen { anotherMethodThatReturnsACompletable() }: Это передает lambda выражение методу andThen. Здесь anotherMethodThatReturnsACompletable() не вызывается во время прохождения лямбда. anotherMethodThatReturnsACompletable() будет вызываться, когда функция lambda вызывается в методе andThen.

Надеюсь, поможет.

Ответ 3

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

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

Ответ 4

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

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