Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)

Estoy migrando nuestra aplicación de RxJava 1.xx a RxJava 2.xx Tengo un problema con uno de mis methods: devuelve un tipo de devolución diferente. Tenía este método en la versión 1.xx:

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)) } } } 

Como puede ver, el tipo de resultado es Observable<PermissionsUsers?> . En RxJava2, los observables nulos no están permitidos. Resolví este problema con Opcional. También reemplacé las classs observables con Flowable porque necesito administrar la estrategia de contrapresión. Significa que el tipo de devolución ha cambiado de Observable<PermissionsUsers?> Flowable<Optional<PermissionUsers>> . Este es el método cambiado:

 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() } } } 

El problema es que ahora el tipo de devolución requerido está envuelto en un único extra. Por lo tanto, se ve así: Single<Flowable<Optional<PermissionsUsers>>>
en lugar de Flowable<Optional<PermissionsUsers>> . ¿Tienes alguna idea de cómo eliminar ese single? No puedo cambiar el tipo de devolución.

toList() (que devuelve un Single ) está en el lugar equivocado.

Cambiarlo de esto:

 return DatabaseRead.permissions(groupId) .flatMap { Flowable.fromIterable(it.toSome()).map { // Map code } } .toList() .map { // Map code } 

A esto:

 return DatabaseRead.permissions(groupId) .flatMap { Flowable.fromIterable(it.toSome()).map { // Map code }.toList() }.map { // Map code } 
  • Cómo controlar el flujo sin .flatMap, que rompe una stream reactiva que impide que operadores como distinctUntilChanged trabajen en toda la secuencia
  • kotlin consiguiendo un suscriptor para observar un observable usando RxJava2
  • Cómo upload el valor de retorno de un constructor
  • Kotlin y RxJava2 zip operator - Ninguna de las siguientes funciones puede invocarse con los arguments suministrados
  • Cómo retrasar onError () en RxJava 2 y Android?
  • El método de callback a menudo para reenviar el evento a Observable?
  • Utilice la unidad de Kotlin (o cualquier otro object) escriba en el layout de Android
  • Proguard: ¿Qué regla puedo agregar para evitar no puedo encontrar la class referenceda?
  • Cómo hacer que la function regrese Observable
  • Problema de encadenamiento Completable after flatMapCompletable
  • JsonArray a la class de datos de Kotlin con Retrofit (se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY)