迭代Flux时如何更新属性值?响应式编程求助
问题分析与解决
你的编译错误根源有两个:
map操作符的使用错误:map要求lambda返回一个非void的结果,但pm.setTotalRefundAmount()是无返回值的void方法,违反了map的泛型约束。- 响应式流的懒执行特性:即使修复了第一个问题,代码也不会实际运行——因为Flux是懒加载的,必须触发订阅才会执行整个处理链。
正确实现方式
方式一:用doOnNext处理属性修改(推荐)
doOnNext专门用于处理流中元素的副作用操作(比如修改对象属性),它不会改变流的元素类型,适合这种场景:
private void updatePaymentDocument(Payment paymentDoc, PaymentTransaction txn) { Flux.fromIterable(paymentDoc.getPaymentMethods()) .filter(pm -> pm.getSequenceNo().equalsIgnoreCase(txn.getSequenceNo())) .doOnNext(pm -> pm.setTotalRefundAmount(txn.getPaymentAuthorization().getAuthorizedAmount())) .subscribe(); // 必须调用subscribe触发执行 }
方式二:调整map的返回值
如果一定要用map,需要在lambda中返回修改后的对象,满足map的返回值要求:
private void updatePaymentDocument(Payment paymentDoc, PaymentTransaction txn) { Flux.fromIterable(paymentDoc.getPaymentMethods()) .filter(pm -> pm.getSequenceNo().equalsIgnoreCase(txn.getSequenceNo())) .map(pm -> { pm.setTotalRefundAmount(txn.getPaymentAuthorization().getAuthorizedAmount()); return pm; // 返回修改后的对象,符合map的约束 }) .subscribe(); // 必须订阅才会执行 }
补充说明
因为PaymentMethod是引用类型,修改流中元素的属性后,原paymentDoc中的对应对象也会同步更新——二者指向同一个内存引用。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

