Intereting Posts
Как использовать «для» для этого случая Быстрое наследование объектов и значение интерфейса Dagger2 – дубликат экземпляра в DoubleCheck Как высмеять функцию верхнего уровня в котлине с помощью jmockit Сравнить String Kotlin Я хочу определить, является ли класс JVM классом Котлина или нет Простой пример kotlin печатает kotlin.Unit при печати результата функции infix Как я могу определить, когда тип Kotlin будет сопоставлен с типом Java? Зачем использовать разницу между объявлением и сайтом Java / Android / Kotlin: отражение на частном поле и вызов общедоступных методов на нем Kotlin: «synchronized» заставляет компилятор не быть уверенным в инициализации переменной разреженный список значений с использованием диапазонов Каков правильный способ получения разрешений для намерений телефонных звонков Класс SpringBoot + Jackson + Kotlin: игнорируются аннотации полей Как импортировать пакеты Java в Kotlin Native

Ссылка конструктора Котлина с дженериками

У меня этот код в (Rx) Java:

Observable.fromArray(1, 2, 3) .flatMap(this::intToBooleanObservable, Pair::new) ..... 

Я бы ожидал, что соответствующий код Котлина будет выглядеть так:

 Observable.fromArray(1, 2, 3) .flatMap(::intToBooleanObservable, ::Pair) ..... 

Однако компилятор не может вывести общий тип пары, поэтому лучшее, что я могу сделать сейчас, это:

 .flatMap(::intToBooleanObservable, { a, b -> a to b }) 

Это не так лаконично, как хотелось бы.

Есть ли способ достичь этого, не объявляя переменные a и b ?

Та же проблема здесь. Несколько других обходных решений (в том порядке, в котором я их использовал), вам может понравиться один из них.

1) Написание собственного оператора:

 fun <T, U> Single<T>.flatMapPair(func: (T) -> Single<U>) : Single<Pair<T, U>> { return this.flatMap { t -> func.invoke(t).map { u -> t to u } } } 

2) Переместите обертывание в условное Observable (здесь intToBooleanObservable), возвращая результат в виде пары или более явный и настраиваемый тип (закрытый класс с двумя дочерними элементами, например «Успех и сбой»). Это позволяет использовать более явный код:

  when(it) { is Success -> ... is Failure -> ... } 

3) В зависимости от результата intToBooleanObservable у вас теперь есть 2 разных сценария (я полагаю). Обычно это своего рода отказ / отказ, быстро решаемый. Для этого напишите фильтр с побочным эффектом, где предикат является наблюдаемым, тем самым избегая проблемы:

 fun <T> Observable<T>.filterSingle(predicate: (T) -> Single<Boolean>, rejectionFunction: (T) -> Unit): Observable<T> = ... //filter with the given predicate, and call rejectionFunction if item doesn't pass 

4) Последний метод работает только с логическим результатом. Что, если меня интересует причина отказа / отказа дать содержательное сообщение? Ради однородного кода я сбросил этот оператор. Вдохновленный другими языками функционалов, я определил один тип и определенные общие операторы Aither + RxJava; mapRight, flatMapRight и более важный dropLeft. dropLeft – это как обобщение filterSingle.

 inline fun <L, R> Observable<Either<L, R>>.dropLeft(crossinline sideEffect: (L) -> Unit): Observable<R> = this.lift { downObserver -> object: Observer<Either<L, R>> { override fun onError(throwable: Throwable?) = downObserver.onError(throwable) override fun onSubscribe(disposable: Disposable?) = downObserver.onSubscribe(disposable) override fun onComplete() = downObserver.onComplete() override fun onNext(either: Either<L, R>) = when (either) { is Right -> downObserver.onNext(either.value) is Left -> sideEffect(either.value) } } } 

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