gpt4 book ai didi

java - 在一个 java 流 lambda 函数中求和不同的值

转载 作者:行者123 更新时间:2023-11-29 10:09:46 25 4
gpt4 key购买 nike

我有一个用例需要对该对象中的不同字段求和,所以我这样编码,我可以将它放在一个流中吗?

int totalUnits = records.stream()
.mapToInt(DynamoSalesAggregateSummaryRecord::getUnits).sum();
int totalReturns = records.stream()
.mapToInt(DynamoSalesAggregateSummaryRecord::getReturns).sum();
int totalCancellations = records.stream()
.mapToInt(DynamoSalesAggregateSummaryRecord::getCancellations).sum();
BigDecimal totalRevenue = records.stream()
.map(DynamoSalesAggregateSummaryRecord::getRevenue)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalRoyalties = records.stream()
.map(DynamoSalesAggregateSummaryRecord::getRoyalties)
.reduce(BigDecimal.ZERO, BigDecimal::add);

最佳答案

老实说,我不会那样做。相反:首先摆脱代码重复:编写一个调用的小助手:

return records.stream().mapToInt(accessorMethod).sum();

(将访问器传递给该方法的地方)。

然后你可以去:

int totals = fetch(DynamoSalesAggregateSummaryRecord::getUnits) + fetch(DynamoSalesAggregateSummaryRecord::getReturns) + ...

但除此之外 - 实际上并不清楚您打算在这里做什么。上面的示例假设您将构建所有条目的“总和”。如果情况并非如此 - 并且您想要“不同”的总和,我的建议是放弃使用 mapToInt()。而是做类似的事情:

class SumHelper {
private int unitTotals = 0;
private int returnTotals = 0;
...

public add(DynamoSalesAggregateSummaryRecord record) {
unitTotals += record.getUnits();
...

像这样使用:

  SumHelper helper = new SumHelper;
records.forEach(r -> helper.add(r));

换句话说:你想在一条记录上调用多个不同的方法;构建不同的总和。您不能对流执行此操作 - 因为一次操作会创建多个 结果。因此,您需要一些其他 类型的“存储”来跟踪不同的结果。

关于java - 在一个 java 流 lambda 函数中求和不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663860/

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