2017-11-03 5 views
1

私はrxjava2で推奨される方法を探していますが、1つのフローが条件付きの動作につながるケースを扱うことができます。rxjava2 - もしかすると他の場合

より具体的には、私はそれが私が新しいStringを作成し、データベースに保存したく存在しない場合Stringは、存在する場合や、データベース上Stringを更新したいMaybe<String>を持っています。

私は、以下の考えが、明らかにそれは私が探していますものではありません。

Maybe<String> source = Maybe.just(new String("foo")); //oversimplified source 
source.switchIfEmpty(Maybe.just(new String("bar"))).subscribe(result -> 
System.out.println("save to database "+result)); 
source.subscribe(result -> System.out.println("update result "+result)); 

上記明らかに、私はまだ期待される結果を与えるが、それより下でも試してみました

save to database foo 
update result foo 

を生成それが...奇妙だと感じる。

結果が存在する場合と存在しない場合の対処方法を教えてください。そのユースケースはrxjava2でどのように扱われるはずですか?

更新01

私は以下しようと、それは私が上記思い付いたよりもきれいに見えます。ただし、rxjava2の練習をお勧めします。

Maybe.just(new String("foo")) 
    .map(value -> Optional.of(value)) 
    .defaultIfEmpty(Optional.empty()) 
    .subscribe(result -> { 
     if(result.isPresent()) { 
      System.out.println("update result "+result); 
     } 
     else { 
      System.out.println("save to database "+"bar"); 
     } 
    }); 
+0

ソースObservableで2回購読しています。あなたはそれを二度実行することを意味します。両方のコードブロックで表示しています。 – masp

+0

@maspあなたは正しいです、これは私のやっていることではありません。空と空でない結果を処理したいところで、私の問題をどのように解決することをお勧めしますか? – simon

+0

最初のブロックの最初の3行は、実際は上手く見えます。しかし、彼らはあなたのソースが何かを発するケースだけをカバーします。したがって、ソースが何も出力しない(単純に完了する)別のケースを作成すると、2番目のObservableが実行されていることがわかります。また、個人的に私はdoOn *メソッドをログにのみ使用します。 – masp

答えて

0

このようなものを試してみてください。 checkDBは、MaybeまたはSingle、またはoptionalまたはラッパーオブジェクトのいずれかを放射するものを返すことができます。

checkDB(String) 
      .flatMap(s -> { 
       if (s.isPresent()) { 
        return updateDB(s.get()); 
       } else { 
        return insertDB("new String"); 
       } 
      }) 
0

あなたはたぶんソースが空であるかどうブール戻りますのisEmpty()演算子を持って、その後、あなたはそれをflatMapとこれはそのブール

0

に応じた場合はelse文を書くことができます私たちのコードでも共通のパターンですが、私たちの場合は選択肢自体が非同期です。 flatMapXとswitchIfEmptyをどちらかの順序で作成するだけで、適切なセマンティックを得ることができないので、なぜこれがAPIの一部ではないのか不思議です。 (2つのオプションが両方ともCompletablesているとき、私たちは同様に他のタイプの似たものを持っているため、この例では)

は、ここでは、今のやっていることだ:

public static <T> Completable flatMapCompletable(Maybe<T> target, 
               @ClosureParams(FirstParam.FirstGenericType.class) 
                 Closure<? extends CompletableSource> completableSupplier, 
               Supplier<CompletableSource> emptySupplier) { 
    Maybe<T> result = target.cache(); 
    return result.isEmpty().flatMapCompletable(empty -> { 
     if (empty) { 
      return emptySupplier.get(); 
     } else { 
      return result.flatMapCompletable(completableSupplier::call); 
     } 
    }); 
} 

私たちは、そう、Groovyのを使用していますこれらを拡張メソッドとしてパッケージ化します。私はcache()を使用する必要性に感心していないので、より良い選択肢があるかどうか疑問に思います。コードを見ると、基本的にflatMapXとスイッチを組み合わせたオペレータは、それほど難しくないようです(しかし、私は何かが欠けているように感じます)。

関連する問題