(アンドロイド/ Javaのプロ、RxJava /ラムダ初心者)私は、次のPOJO作成しようとしています:RxJava&Retrofit2: '一度の' 組み合わせたPOJOを返すために依存観測結果をチェーン
public class ProductCombinedPojo {
private ProductPojo product;
private List<TemplatePojo> templates;
// builder pattern...
}
ProductPojo
は次のとおりです。
public class ProductPojo {
private List<String> templateUrls; // each url returns a TemplatePojo
// lots of other stuff...
}
I持って、次のRetrofit2実装:
@GET
Observable<ProductPojo> getProduct(@Url String url);
@GET
Observable<TemplatePojo> getTemplate(@Url String url);
最初のObservable
はProductPojo
を返し、結果リストuf urlを繰り返して2番目のObservable
に入力してTemplatePojo
のリストを取得します。最後に結果はすべて、ビルダーパターンを使用して新しいProductCombinePojo
に結合されます。 MVPフレームワークの性質上、問題をさらに複雑にするためには、これはすべてFunc0<<Observable<ProductCombinedPojo>>
のRxJavaチェーン実装で行う必要があります。
私は鎖の最後にきちんとオリジナルのProductPojo
をビルダーに注入するのが難しいです。ここに私の作業が、醜いソリューション(mUrl
、mProductApi
& mTemplateApi
は全て上記のように注入され、定義されていると仮定)である:私は醜いfinal ProductPojo[]
を必要としないように
@Override
public Observable<ProductCombinedPojo> call() {
final ProductPojo[] aProductPojo = new ProductPojo[1]; // <------------ Ugly!
return mProductApi
.getProduct(mUrl)
.flatMapIterable(new Func1<ProductPojo, List<String>>() {
@Override
public List<String> call(ProductPojo productPojo) {
aProductPojo[0] = productPojo; // <------------ Ugly!
return productPojo.getTemplateUrls();
}
})
.flatMap(new Func1<String, Observable<TemplatePojo>>(){
@Override
public Observable<TemplatePojo> call(String templateUrl) {
return mTemplateApi.getTemplate(templateUrl);
}
})
.toList()
.map(new Func1<List<TemplatePojo>, ProductCombinedPojo>() {
@Override
public ProductCombinedPojo call(List<TemplatePojo> templatePojos) {
return ProductCombinedPojo.Builder.aProductCombinedPojo()
.product(aProductPojo[0]) // <------------ Ugly!
.templates(templatePojos)
.build();
}
});
}
は、どのように私はこれを書き換えるのですか? exhuastive検索とこのフォーラムに多くの類似の質問を確認した後、私は思います
Func2<ProductPojo, List<TemplatePojo>, ProductCombinedPojo>
はどこかに接続する必要がありますが、私は正確にどこ把握することはできません。私はラムダソリューションがどのようなものになるか興味を持っていますが、正解は上記のフォーマットを使用するソリューションに与えられます。
一般的に、あなたが明示的に作成せずに2つ(またはそれ以上)の要素を組み合わせることができ、「組み合わせpojo "のようなタプルを使用しています:http://www.javatuples.org – EpicPandaForce
最終的に明示的なpojoまたはTupleを返したかどうかに関わらず、何らかの形でオペレーターチェーンの下で' ProductPojo'をバブルする必要があります。 nhaarmanは以下の 'Pair' Tupleについて言及しています。私は最初の 'flatMap'でタプルの組み合わせを作ることを考えました。問題は、その後の 'flatMapIterable'や' from'の出力が反復可能でなければならないことです。タプルはそのまま使えます(私が間違っていれば私を修正します)。 –