我们如何在RxJava代码中转换下面的代码

时间:2016-05-16 14:34:08

标签: java rx-java

public List<CustomerDTO> getCustomerSalaryByDepartmentNumber(String departmentNumber) {
    List<CustomerDTO> customers = customerService.getCustomerSalaryByDepartmentNumber(departmentNumber);

    if (CollectionUtils.isNotEmpty(customers)) {
       for (CustomerDTO customer : customers) {
          customerService.updateCustomDataOne(customer);
          customerService.updateCustomDataTwo(customer);
       }
    }
    return customers;
}

我是RxJava的新手,并试图理解Observables的概念 我想重构Rx Java中的上述简单代码,并且不希望在方法结束时使用Observable.just(customers);。如果有人能指出我正确的方向,那将会很有帮助。

请查看以下代码并提供建议。

public Observable<Object> getCustomerSalaryByDepartmentNumber(String departmentNumber) {

    Observable<List<CustomerDTO>> customersObservable = Observable.just(departmentNumber).map(dnum -> {
       return customerService.getCustomerSalaryByDepartmentNumber(dnum);
    });

    return customersObservable.map(customers -> {
       return Observable.from(customers).map( customer -> {
           return Observable.zip(
                Observable.just(customerService.updateCustomDataOne(customer)), 
                Observable.just(customerService.updateCustomDataTwo(customer)), 
                (r, u) -> {
                   customer.setCustomDataOne(r.getCustomDataOne());
                   return customer;
                });
       });
    });
  }

1 个答案:

答案 0 :(得分:1)

这有点令人困惑,因为上面的两种方法做了不同的事情。 在命令式版本中,您没有使用updateCustomData方法的返回值,也没有使用setCustomDataOne方法。

如果您希望直接Observable转换第一种方法,那么以下内容如何:

public Observable<CustomerDTO> getCustomerSalaryByDepartmentNumber(String departmentNumber) {
        return Observable.from(customerService.getCustomerSalaryByDepartmentNumber(departmentNumber))
                .doOnNext(customer -> {
                    customerService.updateCustomDataOne(customer);
                    customerService.updateCustomDataTwo(customer);
                });
    }

请注意Observable.from(List<T>)的使用情况,该Observable将返回list,它将按顺序发出customersObservable的每个元素。这样做无需检查是否有空列表。

关于第二种方法,public Observable<CustomerDTO> getCustomerSalaryByDepartmentNumber(String departmentNumber) { return Observable.from(customerService.getCustomerSalaryByDepartmentNumber(departmentNumber) .map(customer -> { return Observable.zip( Observable.just(customerService.updateCustomDataOne(customer)), Observable.just(customerService.updateCustomDataTwo(customer)), (r, u) -> { customer.setCustomDataOne(r.getCustomDataOne()); return customer; }); }); } 对象的创建和使用是多余的,因此可以替换为以下内容:

customerService.updateCustomDataxxx

请注意,Observable.zip会返回 not void CookieManager.getInstance().setAcceptCookie(true); 将不会执行压缩函数,直到所有被压缩的Observable都发出一些东西。这让我多次出局。

希望这有帮助