簡體   English   中英

使用來自助焊劑的數據將助焊劑減少到 mono

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM