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