2017-07-26 15 views
0

私たちのアプリケーションをRxJava 1.x.xからRxJava 2.x.xに移行しています。私は私のメソッドの1つに問題があります - それは別の戻り値の型を返します。あなたは結果の型がObservable<PermissionsUsers?>で見ることができるようにRxJava 2で異なる戻り値の型(RxJava1から更新)

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

:私は、バージョン1.x.xでこのメソッドを持っていました。 RxJava2では、null可能なオブザーバブルは使用できません。私はこの問題をオプションで解決しました。私はObservableクラスをBackableの戦略を管理する必要があるFlowableの原因に置き換えました。戻り値の型が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<Flowable<Optional<PermissionsUsers>>>
の代わりにFlowable<Optional<PermissionsUsers>>のようになります。そのシングルを削除する方法はありますか?私は戻り値の型を変更することはできません。

答えて

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 
     } 
+0

私はあなたの答えに基づいてコードを更新しました。問題は依然として続きます。 –

+0

@PepaHruškaそれはまだ 'シングル'を返しますか? ['Flowable.flatMap()'](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#flatMap(io.reactivex.functions.Function))と[Flowable。 map() '](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#map(io.reactivex.functions.Function))は、両方とも' Flowable'を返します。 'DatabaseRead.permissions()'は 'Flowable'ではなく' Single'を返します... – Bryan

関連する問題