[英]Reduce a flux to mono using data from flux
我有這種情況。 我有一個分頁的 API,它為我提供了過去 12 個月的數據。 API 的響應如下:
public class PagedTransfersDto {
private List<Transfer> content;
private Page page;
@Getter
public static class Transfer {
private String id;
private Long transferId;
private Long transferRequestId;
private String status;
private BigDecimal accountReceivable;
private BigDecimal accountPayable;
private BigDecimal netReceivable;
private BigDecimal netPayable;
private String currency;
private Long transferDate;
}
@Getter
public static class Page {
private Integer size;
private Integer number;
private Integer totalElements;
private Integer totalPages;
}
}
現在我必須收集所有數據,然后計算所有netReceivable
的總和並作為Mono<CompanyIncome>
返回。 這個pojo就像
public class CompanyIncome {
private BigDecimal inferredIncome = new BigDecimal(0);
}
為此,我寫了如下內容:
CompanyIncome initialIncome = new CompanyIncome();
return myService.getTransfers(0, 50, fromDate, toDate)
.expand(pagedTransfersDto -> {
if (pagedTransfersDto.getPage().getNumber().equals(pagedTransfersDto.getPage().getTotalPages())) {
return Mono.empty();
}
return myService.getTransfers(pagedTransfersDto.getPage().getNumber() + 1, 50, fromDate, toDate);
})
.flatMap(pagedTransfersDto -> Flux.fromIterable(pagedTransfersDto.getContent()))
.reduce(initialIncome, ((companyIncome, transfer) -> {
companyIncome.setInferredIncome(companyIncome.getInferredIncome().add(transfer.getNetReceivable()));
return companyIncome;
}));
現在要注意的是,這些數據可能只有 3 個月,在這種情況下,我必須乘以 4 將其推斷為 12 個月。
我在想的是獲取傳輸列表的第一項和最后一項,看看數據是否不是一整年,但想不出在哪里執行此操作。
由於減少后傳輸數據消失了。 在此之前,我似乎無法找到一種方法來獲取這些信息並仍然減少轉移通量
我對反應方式有點陌生,似乎無法找到一種方法來做到這一點。 任何幫助將不勝感激。 謝謝
為此,最好的解決方案是將必要的“元數據”存儲在簡化的 object 中。 您已經有一個CompanyIncome
object,所以也許這是個好地方? 否則,我會引入一個Tuple2
或一些中間業務 object (例如CompanyIncomeAggregator
)來存儲總收入和您需要在最后決定是否需要進一步處理的信息。
然后在map
步驟中,您將閱讀該信息,對其采取行動,然后按原樣返回計算的收入或根據您的標准進行修改。
重要提示:使用反應鏈外部的變量是一種代碼異味,因為它會引入泄漏的共享 state:如果對同一個 Mono 進行兩次訂閱,它們將在同一個CompanyIncome
ZA8CFDE6331BD49EB62AC96ZF89111 上工作您可以在此處使用reduceWith
進行補救,它將Supplier
作為初始值: reduceWith(CompanyIncome::new, ...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.