2016-05-16 64 views
1
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,并试图了解我想重构上面的Rx的Java简单的代码观测量 的概念,不希望在年底使用Observable.just(customers);的方法。如果有人能指引我正确的方向,这将是有益的。我们如何转换下面的代码在RxJava代码

请看下面的代码并提供建议。

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

这有点令人困惑,因为你上面的两个方法做了不同的事情。 在命令式版本中,您没有使用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将不会执行压缩功能,直到所有被压缩的Observables都发出一些东西。这让我出了很多次。

希望这可以帮助

+0

感谢您的建议。 – Parmod