如何以及何时转换不同类型对象的分组列表列表

How and when transform a list of grouped list of objects of different types

我想知道什么时候(在分组之后和收集到 List<List<Object>> 之前)和如何(收集后重新流式传输收集的组)。

我可以转换对象的每个子列表吗

[Exon{45 2021-01-01 4}, Exon{45 2021-01-01 4}, Sup{45 2021-01-01 4}] 
and 
[Exon{33 2023-01-01 2}, Sup{33 2023-01-01 2}] 
and 
[Exon{21 2022-01-01 5}, Sup{21 2022-01-01 5}]

转换为名为 GlobalData?

的新对象类型

如有任何建议,我们将不胜感激。

这个问题与我之前的问题有关:

这是 Dan 提供的代码,用于将我的不同对象分组到收集到列表的对象列表中: https://ideone.com/OSTItQ

public class GlobalData {

private UUID id = UUID.randomUUID();

private IncomeCode incomeCode;

private LocalDate endDate;

private String codeRef;

private boolean taxable;

private String pw = "";

private BigDecimal area = BigDecimal.ZERO;

//private BigDecimal taxableIncome = BigDecimal.ZERO;

private BigDecimal value = BigDecimal.ZERO;

private BigDecimal exonValueType = BigDecimal.ZERO;

private BigDecimal Income = BigDecimal.ZERO;

private BigDecimal exemptedIncome = BigDecimal.ZERO;

private BigDecimal refIncome = BigDecimal.ZERO;
 
}

List<GlobalData> globalTaxDataList = listRes.stream()
            .map(this::toGlobalData)
            .collect(Collectors.toList());

private GlobalData toGlobalData(List<Object> objects) {
        GlobalData globalData = new GlobalData();
        objects // list of mix Exons and Sups objects (Exon and Sup contain more, fields incomeCode, endDate and codeRef are used only for grouping) ex: [Exon{45 2021-01-01 4}, Exon{45 2021-01-01 4}, Sup{45 2021-01-01 4}]
            .forEach(o -> {
                if (o instanceof Exon) {
                  globalData.setValue(globalData.getValue()
                     .add(o.getValue()))
                   if (o.getxxx()> 100) {
                     globalData.setIncome(globalData.getIncome()
                      .add(calcMethod(o)))
                   }
                   //more business code here
                }

                if (o instanceof Sup) {     
                   globalData.setValue(globalData.getValue()
                    .add(o.getValue()))
                   if (o.getxxx()> 100) {
                      globalData.setIncome(globalData.getIncome()
                         .add(calcMethod(o)))
                   }
                   //more business code here
                }
            });
    return globalData;
}

在你之前的问题中,你有一个 List<List<Object>> 作为输出,而现在你想将每个 List<Object> 映射到一个 GlobalData 实例。

请注意,我只是根据我从你的问题中得到的一些细节给你这个答案,并且不知道你的 类.

之间的关系
List<GlobalData> listGlobalData = listMixed.stream()
        .map(list -> {
            //Mapping each list to a GlobalData object

            //Retrieving an object from the list to create a GlobalData 
            Object firstObj = list.stream().findFirst().orElse(null);
            if (firstObj == null) {
                return null;
            }

            //Instacing a GlobalData with IncomeCode, EndDate and CodeRef
            GlobalData gd = null;
            if (firstObj.getClass() == Exon.class) {
                Exon exon = (Exon) firstObj;
                gd = new GlobalData(exon.getIncomeCode(), exon.getEndDate(), exon.getCodeRef());
            } else {
                Sup sup = (Sup) firstObj;
                gd = new GlobalData(sup.getIncomeCode(), sup.getEndDate(), sup.getCodeRef());
            }

            //Updating the GlobalData with each object of the list 
            for (Object o: list){
                if (o.getClass() == Exon.class){
                    Exon exon = (Exon) o;
                    gd.setValue(gd.getValue().add(exon.getValue()));
                    if (exon.getXxx() > 100){
                        gd.setIncome(calcMethod(exon));
                    }
                } else {
                    Sup sup = (Sup) o;
                    gd.setValue(gd.getValue().add(sup.getValue()));
                    if (sup.getXxx() > 100){
                        gd.setIncome(calcMethod(sup));
                    }
                }
            }
            return gd;
        })
        .filter(obj -> obj != null)
        .collect(Collectors.toList());

这里还有一个 link 我已经发布了我的整个解决方案来测试上面的代码。但是,由于托管解决方案的服务器存在执行时间限制,因此不会显示输出,但您仍然可以检查 link 以复制代码并在您的计算机上进行测试。

我还提供了一些虚拟 类 来模拟示例中显示的某些方法的行为。

https://ideone.com/rN5XVa