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

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

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

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

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

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

Solutions Collecting From Web of "В чем разница между фигурными фигурными скобками и нормальными скобками в RxJava с Kotlin"

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

Во втором сегменте кода вы пишете функциональный литерал как выражение лямбда . Он передает функцию типа () -> 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 }) 

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

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

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

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

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

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

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

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

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