Intereting Posts
Как создать круговой индикатор выполнения (круговая диаграмма), как индикатор – Android Ошибка установки: INSTALL_FAILED_UID_CHANGED Нержавеющий Android-телефон Пользовательский вид с компоновкой XML в Android Палирование теневой кнопки кнопки с плавающей кнопкой при просмотре полей Lollipop VM в Genymotion – возможно, ARM Translation не работает Как выйти (только) текущая активность, если происходит событие UncaughtExceptionHandler? Как начать работу со службы? Есть ли разница между «center_horizontal | center_vertical» и «center» Приложение не работает в android 4.0 и выше Изображение камеры на держателе поверхности, рисунок: Исключение из-за типа поверхности Как исправить ошибку Невозможно выполнить dex: несколько файлов dex определяют Lcom / google / android / gcm / GCMBaseIntentService ;? ADT показывает ошибку в Strings.xml После обновления Android Studio, показывающего ошибку Самая странная ошибка Android когда-либо – Возможно, проблема ProGuard? Как некоторые приложения блокируют или заменяют уведомления о хедз-ап?

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

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

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

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

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

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

Первый сегмент кода выполняет 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()

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

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