我有这种情况。我有一个分页的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个月。
我在想什么是获取转移清单的第一项和最后一项,并查看数据是否不是整年的,但无法想到执行此操作的地方。
由于减少传输之后,数据消失了。在此之前,我似乎无法找到一种方法来获取此信息并仍然减少转移流量
我对被动方式有点陌生,似乎无法找到一种方式来做到这一点。任何帮助将不胜感激。谢谢
为此,最佳解决方案是将必要的“元数据”存储在精简对象中。您已经有一个CompanyIncome
对象,所以也许这是一个好地方?否则,我将介绍一个Tuple2
或一些中间业务对象(例如CompanyIncomeAggregator
),在其中存储汇总收入和最终需要确定的信息(如果需要进一步处理)。
然后在一个map
步骤中,您将读取该信息,对其进行操作,然后按原样返回计算出的收入,或者根据您的标准对其进行修改。
重要说明:在反应链外部使用变量是一种代码味道,因为它引入了泄漏的共享状态:如果对同一个Mono进行了两个预订,则它们将在同一个CompanyIncome
对象上工作。您可以通过使用进行补救reduceWith
,该方法使用Supplier
初始值:reduceWith(CompanyIncome::new, ...)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句