我正在将我们的应用程序从RxJava 1.x.x迁移到RxJava 2.x.x.我的一个方法有问题 - 它返回不同的返回类型。我在版本1.x.x中使用了这个方法:
fun permissionsUsers(groupId: String): Observable<PermissionsUsers?> {
return DatabaseRead.permissions(groupId)
.flatMap {
Observable.from(it).map {
combineLatest(DatabaseRead.user(it.getId()), Observable.just(it.level), ::UserLevel)
}.toList()
}
.flatMap {
Observable.combineLatest(it) {
var owner: User? = null
val editPermissions = mutableListOf<User>()
val readOnlyPermissions = mutableListOf<User>()
it.forEach {
it as UserLevel
when (it.level) {
Permission.LEVEL_OWNER -> owner = it.user
Permission.LEVEL_WRITE -> editPermissions.add(it.user)
Permission.LEVEL_READONLY -> readOnlyPermissions.add(it.user)
}
}
PermissionsUsers(checkNotNull(owner, { "Owner doesn't exist" }), editPermissions.sortedBy(User::name), readOnlyPermissions.sortedBy(User::name))
}
}
}
如您所见,结果类型为Observable<PermissionsUsers?>
。在RxJava2中,不允许使用可空的可观察对象。我用Optional解决了这个问题。我还用Flowable替换了Observable类,因为我需要管理Backpressure策略。这意味着返回类型已从Observable<PermissionsUsers?>
更改为Flowable<Optional<PermissionUsers>>
。
这是改变的方法:
fun permissionsUsers(groupId: String): Flowable<Optional<PermissionsUsers>> {
return DatabaseRead.permissions(groupId)
.flatMap {
Flowable.fromIterable(it.toSome()).map {
combineLatest(DatabaseRead.user(it.getId()), Flowable.just(it.level.toOptional()), ::UserLevel)
}.toList()
}
.map {
Flowable.combineLatest(it) {
var owner: User? = null
val editPermissions = mutableListOf<User>()
val readOnlyPermissions = mutableListOf<User>()
it.forEach {
it as UserLevel
when (it.level) {
Permission.LEVEL_OWNER -> owner = it.user
Permission.LEVEL_WRITE -> editPermissions.add(it.user)
Permission.LEVEL_READONLY -> readOnlyPermissions.add(it.user)
}
}
PermissionsUsers(checkNotNull(owner, { "Owner doesn't exist" }), editPermissions.sortedBy(User::name), readOnlyPermissions.sortedBy(User::name)).toOptional()
}
}
}
问题是现在所需的返回类型被包装到额外的Single。所以它看起来像这样:Single<Flowable<Optional<PermissionsUsers>>>
而不是Flowable<Optional<PermissionsUsers>>
。你知道如何删除那个单身吗?我无法更改返回类型。
答案 0 :(得分:0)
toList()
(返回Single
)位置错误。
从中改变:
return DatabaseRead.permissions(groupId)
.flatMap {
Flowable.fromIterable(it.toSome()).map {
// Map code
}
}
.toList()
.map {
// Map code
}
对此:
return DatabaseRead.permissions(groupId)
.flatMap {
Flowable.fromIterable(it.toSome()).map {
// Map code
}.toList()
}.map {
// Map code
}