2016-05-16 61 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