2017-03-03 7 views
0

「単純な問題」に対するRXJava2ソリューションの策定には苦労しています。私は単純なユースケースを超えてRXJavaをよく経験していません。AndroidでRXJava2を使用したネストされたリストの統合/平滑化

私はのように見えることContainerがあるとします。モデルの残りの部分は、このモデルのようなネストされたリストのシリーズです

class Container { 
    List<A> listOfA; 
} 

class Base { 
    // irrelevant content 
} 

class A extends Base { 
    List<B> listOfB; 
} 

class B extends Base { 
    // irrelevant content 
} 

私のコードのどこかに、私が取得Single<Container>ように:

注:読みやすくするために、コード/タイプ/などは難読化/簡略化されました。

disposables = new CompositeDisposable(); // not important here 

disposables.add(
    interactor.getTheContainer() // This returns a Single<Container> 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeWith(new DisposableSingleObserver<Container>() { 

      // on error ommited for clarity 

      @Override 
      public void onSuccess(final Container value) { 
       process(value); 
      } 
     }) 
    ); 

private void process(final Container container) { 
    List<Base> items = new ArrayList<>(); 

    List<A> listOfA = container.getListOfA(); 

    for (A a : listOfA) { 
     items.add(a); 
     items.addAll(a.getListOfB()); 
    } 

    // do something with "items" - ommited for clarity 
} 

)私は失敗し多分私はいけない(RXJavaにメソッドprocess(Container)を変換しようとしてきたが、今私が知りたいです。

私は実験したすべてのものを一覧表示することはできませんが、私はRXJava 2には本当に新しくなっています(RXで過去に何度もやったことの大半は、RetrofitからのObservablesあまりにも派手な、またはオットー/グアバを置き換えるためのイベントバスとして)、私は本当にRXツールセットの良い使い方を熟知していません。私はを考えてくださいマップのいくつかの並べ替えが動作するはずですが、Javaの構文全体は、匿名の方法については私にとって本当に速く混乱しています。

質問です:私はprocess方法のが、RXJava2と同じ操作を実行する方法のアイデアを/見てお読みください

注文重要であり、最終的なリストは、現在の方法で、このようになりますし、私はそれをこのように必要があります。

0. A1 
1. B1.1 
2. B1.2 
3. B1.nn… 
4. A2 
5. B2.1 
6. B2.2 
7. B2.nn… 
8. A3 
9. B3.1 
… 

あなたがアイデアを得ます。

ヒント私はで、はRetrolambdaやJava 8を持っていません(それを使うことはできません。私の決定ではないので、何もできません)。

答えて

1

あなたはほとんどありました:

List<Base> process(List<A> list) { 
    List<Base> result = new ArrayList<>(); 
    for (A a : list) { 
     result.add(a); 
     result.addAll(a.getListOfB()); 
    } 
    return result; 
} 

interactor.getTheContainer() // This returns a Single<Container> 
    .subscribeOn(Schedulers.io()) 
    .map(new Function<Container, List<Base>>() { 
     @Override public List<Base> apply(Container c) { 
      return process(c.getListOfA()); 
     } 
    }) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeWith(new DisposableSingleObserver<List<Base>>() { 
     @Override public void onSuccess(final List<Base> value) { 
      /* display the list */ 
     } 
    }) 

より「複雑な」解決策はIxJavaを経由して、いくつかの反復処理可能な変換と上記マップを置き換えることができます:

.flatMapIterable(new Function<Container, Iterable<A>>() { 
    @Override public Iterable<A> apply(Container c) { 
     return c.getListOfA(); 
    } 
}) 
.flatMapIterable(new Function<Iterable<A>, Iterable<Base>>() { 
    @Override public Iterable<Base> apply(Iterable<A> a) { 
     return Ix.<Base>just(a).concatWith(a.getListOfB()); 
    } 
}) 
.toList() 
+0

それをやったおかげで、。私は近くにいることを知っていた;)余分な図書館を追加するためにIxJavaを試していなかったのは、たくさんの作業が必要だった( "尋ねる、承認する、管理する、などなど...") –

関連する問題