RxJava解释了这个循环

时间:2016-09-21 15:51:55

标签: java android rx-java

有人能解释我这个循环吗?

  private Observable<ArrayList<RateItem>> generateRates(List<Rates> rates){
    rateItemArrayList = new ArrayList<RateItem>();

    Observable<ArrayList<RateItem>> observable = Observable.from(rates)
            .map(new Func1<Rates, ArrayList<RateItem>>() {
                @Override
                public ArrayList<RateItem> call(Rates r) {
                    for(Rates rat : rates)
                     rateItemArrayList.add(new RateItem(rat.getName(),rat.getCode(),rat.getValue()));
                    return rateItemArrayList;
                }
            });
    return observable;
}

我的列表在服务器响应后有35个(已检查)项目,然后我想从此列表中创建不同的ArrayList。为什么这个循环迭代大约1000次而不是35次?之后我的新ArrayList有1350项o.O。

2 个答案:

答案 0 :(得分:2)

您的代码包含副作用:方法更新其上下文之外的对象(此处,map方法更新其外部的列表)。

然后你的for循环很奇怪,因为你循环遍历rates变量,用于构建Observable。 (我认为这不是预期的)

使用非副作用代码,您的代码可以更简单:

 private Observable<List<RateItem>> generateRates(List<Rates> rates){
      return Observable.from(rates)
                       .map(r -> new RateItem(r.getName(), r.getValue())
                       .toList();
  }

它应该与你想要达到的目标非常接近。

答案 1 :(得分:0)

@dwursteisen涵盖了你应该避免的副作用,但代码不正确。我认为这将有效。

Observable<List<RateItem>> = 
  Observable
    .from(rates)
    .flatMap(r -> 
       Observable.from(r)
         .map(rat -> 
           new RateItem(rat.getName(),
                        rat.getCode(),
                        rat.getValue()));