Какая разница между фигурными скобками и нормальными скобками в 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 ()
скобки используются для передачи параметров, а {}
фигурные скобки используются для тела метода, а также представляют собой тело лямбда-выражения.
Так что давайте сравним:
-
.andThen(anotherMethodThatReturnsACompletable())
: здесь и метод Then() принимает Completable
поэтому andThen сохранит ссылку на anotherMethodThatReturnsACompletable()
возвращаемый методом anotherMethodThatReturnsACompletable()
чтобы позже подписаться.
-
.andThen { anotherMethodThatReturnsACompletable() }
: Это передает lambda выражение методу andThen. Здесь anotherMethodThatReturnsACompletable()
не вызывается во время прохождения лямбда. anotherMethodThatReturnsACompletable()
будет вызываться, когда функция lambda вызывается в методе andThen.
Надеюсь, поможет.
Ответ 3
.andThen(anotherMethodThatReturnsACompletable())
означает, что результат anotherMethodThatReturnsACompletable()
будет передан в andThen()
.andThen { anotherMethodThatReturnsACompletable() }
означает, что lambda, которая выполняет anotherMethodThatReturnsACompletable()
будет передана в andThen()
Ответ 4
()
→ Вы передаете что-то внутри них, т.е. аргументы функции
{}
→ Вы выполняете что-то внутри них. т.е. выражение