Замечание типа Observable.combineLatest в kotlin

Я использую RxJava2, Kotlin-1.1 вместе с RxBindings в моем проекте.

У меня есть простой экран входа с отключенной кнопкой входа в систему, я хочу включить кнопку только тогда, когда поля пользователя и пароль не будут пустыми.

LoginActivity.java

Observable<Boolean> isFormEnabled = Observable.combineLatest(mUserNameObservable, mPasswordObservable, (userName, password) -> userName.length() > 0 && password.length() > 0) .distinctUntilChanged(); 

Я не могу перевести вышеуказанный код с Java на Kotlin:

LoginActivity.kt

 class LoginActivity : AppCompatActivity() { val disposable = CompositeDisposable() private var userNameObservable: Observable<CharSequence>? = null private var passwordObservable: Observable<CharSequence>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) initialize() } fun initialize() { userNameObservable = RxTextView.textChanges(username).skip(1) .debounce(500, TimeUnit.MILLISECONDS) passwordObservable = RxTextView.textChanges(password).skip(1) .debounce(500, TimeUnit.MILLISECONDS) } private fun setSignInButtonEnableListener() { val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(userNameObservable, passwordObservable, { u: CharSequence, p: CharSequence -> u.isNotEmpty() && p.isNotEmpty() }) } } 

Я предположил, что это связано с типом вывода третьего аргумента в combinelatest , но я не понимаю проблему, читая сообщение об ошибке: Вывод типа вывода

Ваша проблема заключается в том, что компилятор не может определить, какое переопределение combineLatest для вызова, поскольку у нескольких из них есть функциональные интерфейсы в качестве их третьего параметра. Вы можете сделать преобразование явным с помощью конструктора SAM следующим образом:

 val isSignInEnabled: Observable<Boolean> = Observable.combineLatest( userNameObservable, passwordObservable, BiFunction { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

Ps. Спасибо, что задали этот вопрос, это помогло мне понять, что я изначально ошибался в этом вопросе, который оказался той же проблемой, и теперь я обновил это решение. https://stackoverflow.com/a/42636503/4465208

Вы можете использовать RxKotlin, который дает вам вспомогательные методы для проблемы двусмысленности SAM.

 val isSignInEnabled: Observable<Boolean> = Observables.combineLatest( userNameObservable, passwordObservable) { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

Как вы можете видеть, в RxKotlin используют Observables вместо Observable

Intereting Posts
Почему я не могу ссылаться на аргументы конструктора внутри класса при определении объекта ojAlgo Линейная оптимизация – предотвращение дублирования рабочей смены? Почему в заявлении на печать Kotlin не требуется уточнение сферы применения? Связать размер ObservableList в привязке к Android В Kotlin, как передать параметр, чтобы асинхронная область сохранила его? Как установитьOnEditorActionListener с Kotlin Передача 'этого' конструктору Многокритериальная сортировка Kotlin не компилируется Как создать анонимный интерфейс в моем классе Kotlin и использовать его? Оператор сокращения Kotlin, похоже, не работает Котлин: массив дженериков Ярлык logd не работает в Intellij с Kotlin Kotlin: Android-приложение неожиданно останавливается из-за textView Оператор звездочки Kotlin до имени переменной или оператора Spread в Котлине Атрибут свойства lateinit не был инициализирован в Kotlin4Android