Observable.combineLatest kotlin 中的类型推断
Observable.combineLatest type inference in kotlin
我在我的项目中使用 RxJava2、Kotlin-1.1 和 RxBindings。
我有一个默认禁用 'login' 按钮的简单登录屏幕,我只想在用户名和密码编辑文本字段不为空时启用该按钮。
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。感谢您提出这个问题,它帮助我弄清楚我最初对这个问题的看法是错误的,结果证明是同一个问题,我现在也用这个解决方案更新了这个问题。
您可以使用 RxKotlin,它为您提供了解决 SAM 歧义问题的辅助方法。
val isSignInEnabled: Observable<Boolean> = Observables.combineLatest(
userNameObservable,
passwordObservable)
{ u, p -> u.isNotEmpty() && p.isNotEmpty() })
如你所见,在 RxKotlin 中使用 Observables
而不是 Observable
我在我的项目中使用 RxJava2、Kotlin-1.1 和 RxBindings。
我有一个默认禁用 'login' 按钮的简单登录屏幕,我只想在用户名和密码编辑文本字段不为空时启用该按钮。
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。感谢您提出这个问题,它帮助我弄清楚我最初对这个问题的看法是错误的,结果证明是同一个问题,我现在也用这个解决方案更新了这个问题。
您可以使用 RxKotlin,它为您提供了解决 SAM 歧义问题的辅助方法。
val isSignInEnabled: Observable<Boolean> = Observables.combineLatest(
userNameObservable,
passwordObservable)
{ u, p -> u.isNotEmpty() && p.isNotEmpty() })
如你所见,在 RxKotlin 中使用 Observables
而不是 Observable