2017-03-03 117 views
0

我正在努力想出一个“简单问题”的RXJava2解决方案。除了简单的用例,我对RXJava并不是非常有经验。使用RXJava2在Android中合并/拼合嵌套列表

假设我有一个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 
} 

我一直不成功尝试的方法process(Container)转换为RXJava(也许我不应该,但现在我想知道的)。

我甚至不能列出所有我已经尝试过的东西,但我对RXJava 2非常陌生(我在过去几年中使用RX的大多数用法都是从Retrofit进行简单的观察,而没有任何东西太花哨,甚至作为事件总线来取代Otto/Guava),所以我真的不熟悉使用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来添加额外的库需要很多工作(“询问,批准,管理等等等等等等等等等等......”) –