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;
});
});
});
}
答案 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都发出一些东西。这让我多次出局。
希望这有帮助