gpt4 book ai didi

java - 嵌套的 POJO 列表流到另一个 POJO 列表

转载 作者:搜寻专家 更新时间:2023-11-01 02:37:23 25 4
gpt4 key购买 nike

希望有人能帮助我。我有一个具有以下结构的 POJO:

public class Invoice{

private String docNum;
private String customer;
private ArrayList<InvoiceDetails> invoiceDetails;

/* Getters and setters*/
}

还有另一个 POJO,包含以下内容

public class InvoiceDetails{

private String vatGroup;
private Double vatAmount;
private Double amount;

/* Getters and setters*/
}

另外还有第三个

public class VatType{

private String vatGroup;
private Double vatAmount;
private Double amount;

/* Getters and setters*/
}

我想做的是将 InvoiceList 缩减为 VatTypeList按 vatGroup 分组。就像 SQL 中的 de DISTINCT 子句。假设我有以下列表:

InvoiceDetails idA1 = new InvoiceDetails("S1", 100.0, 40.0);
InvoiceDetails idA2 = new InvoiceDetails("S2", 140.0, 40.0);
InvoiceDetails idA3 = new InvoiceDetails("A1", 50.0, 10.0);
ArrayList<InvoiceDetails> listA = new ArrayList<>();
listA.add(idA1);
listA.add(idA2);
listA.add(idA3);

Invoice invoiceA = new Invoice();
invoiceA.setDetailList(listA);

InvoiceDetails idB1 = new InvoiceDetails("S1", 200.0, 50.0);
InvoiceDetails idB2 = new InvoiceDetails("S2", 240.0, 50.0);
InvoiceDetails idB2 = new InvoiceDetails("A1", 100.0, 20.0);
ArrayList<InvoiceDetails> listB = new ArrayList<>();
listB.add(idB1);
listB.add(idB2);
listB.add(idB3);


Invoice invoiceB = new Invoice();
invoiceB.setDetailList(listB);

List<Invoice> invoiceList = new ArrayList<>();
invoiceList.add(invoiceA);
invoiceList.add(invoiceB);

预期结果将是 ListVatType,其中包含以下项目:

("S1",300.0,90.0)
("S2",380.0,90.0)
("A1",150.0,30.0)

如何使用 stream 一次获取此列表。避免遍历 Lists?提前致谢

最佳答案

您首先需要一个 flatMap创建列表中所有 Invoice 中所有 InvoiceDetails 的流。之后,您可以使用 toMap 的变体进行缩减得到一个合并方法。最后 Mapvalues() 方法将得到 VatTypeCollection:

Collection<VatType> values = invoiceList.stream()
.flatMap(invoices -> invoices.getInvoiceDetails().stream())
.collect(toMap(InvoiceDetails::getVatGroup, VatType::new, (i1, i2) -> {
i1.setAmount(i1.getAmount() + i2.getAmount());
i1.setVatAmount(i1.getVatAmount() + i2.getVatAmount());
return i1;
}))
.values();

使用此 VatType 构造函数的地方:

VatType(InvoiceDetails invoiceDetails) {
vatGroup = invoiceDetails.getVatGroup();
vatAmount = invoiceDetails.getVatAmount();
amount = invoiceDetails.getAmount();
}

如果需要,您可以轻松地从Collection 中创建一个List:

List<VatType> vatTypes = new ArrayList<>(values);

关于java - 嵌套的 POJO 列表流到另一个 POJO 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44652118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com