0

Couchbase Java クライアント 2.2.2 と Rx Observables 1.0.15 を使用して次の操作を行う際に問題が発生しています。

  • ドキュメント名である文字列のリストがあります
  • ドキュメント名の各元のドキュメントとともに、(元のドキュメント名から推測される) 別のドキュメントをロードしたいので、ドキュメントのペアを取得します。これら 2 つのドキュメントのいずれかが存在しない場合は、このペアを使用しないでください。
  • ペアが有効な場合 (つまり、両方のドキュメントが存在する場合)、両方のドキュメントを使用してそれらからカスタム オブジェクトを作成します。
  • それらの変換されたアイテムをリストに結合します

私がこれまでに思いついたことは、本当に意味があるように見えます:

List<E> resultList = new ArrayList<>();

Observable
    .from(originalDocumentNames)
    .flatmap(key -> {
        Observable firstDocument = bucket.async().get(key);
        Observable secondDocument = bucket.async().get(getSecondKeyNameFrom(key));
        return Observable.merge(firstDocument, secondDocument);
    })
    .reduce((jsonDocument1, jsonDocument2) -> {
        if (jsonDocument1 == null || jsonDocument2 == null) {
            return null;
        }
        resultList.add(createCustomObject(jsonDocument1, jsonDocument2);
        return null;
    })
    .filter(Objects.nonNull)
    .singleOrDefault(null)
    .subscribe(new Subscriber<E>() {
        public void onComplete() {
            //use resultList in a callback function
        }
    });

これは動作しません。Observable.mergeどこかわかりませんが、間違った使い方をしていると思います。また、問題全体に間違った方法でアプローチしていると思います。

したがって、主な質問は次のようになります。

  • Observable ストリームに追加のアイテムを発行するにはどうすればよいですか?
  • 2 つのアイテムを別のタイプのアイテムに減らすにはどうすればよいですか? (reduce(T, T, T) はそれを許可しません)
  • 私はそれを間違って取っていますか?
4

2 に答える 2

1

このコードにはいくつかの問題があります:

  1. 副作用、操作はチェーンreduce外のリストに追加されますが、それは間違っています。ObservableRxには操作があるため、リストを返すか、reduceまったく存在しない必要がありtoListます。nullまた、次の操作を返すreduce操作のために、それを処理する必要があります。これはかなりエレガントではありません。

  2. merge操作が間違っています。代わりzipflatmap、ペア/集合体を構築する必要があります。

  3. オプションのポイント : どちらかの get 操作が複数のアイテムを返す場合、flatmap操作は処理されません (おそらく、 couchbase の場合は事実上そうなります)。

私はIDEを持っていないので、今のところコードはありません。しかし、私の意見では、置き換えmergezip削除するreduceことは確かに役立つはずです。

于 2015-12-14T11:20:14.123 に答える