Java 将多个大小数相加到一个映射<;字符串,BigDecimal>;
我正在尝试对Java 将多个大小数相加到一个映射<;字符串,BigDecimal>;,java,sum,java-stream,bigdecimal,Java,Sum,Java Stream,Bigdecimal,我正在尝试对列表中的多个大小数求和。目前,我使用两个流,但如果可能的话,我希望只有一个流。我不确定我怎样才能以一种高效的方式重写下面的内容 BigDecimal totalCharges = tableRowDataList.stream() .map(el -> el.getSums().getCharges()) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal totalFees
列表中的多个大小数求和。目前,我使用两个流,但如果可能的话,我希望只有一个流。我不确定我怎样才能以一种高效的方式重写下面的内容
BigDecimal totalCharges = tableRowDataList.stream()
.map(el -> el.getSums().getCharges())
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalFees = tableRowDataList.stream()
.map(el -> el.getSums().getFees())
.reduce(BigDecimal.ZERO, BigDecimal::add);
正如您所看到的,流所做的基本相同,只是对getCharges/getFees的调用不同
从上面获得结果地图的最佳方法是什么?(这里的键是费用)首先创建一个用于收集结果的类
然后执行与BigDecimal相同的操作,即ZERO
常量和add()
方法
public class ChargesAndFees {
private static final ZERO = new ChargesAndFees(BigDecimal.ZERO, BigDecimal.ZERO);
private final BigDecimal charges;
private final BigDecimal fees;
// constructor and getters
public ChargesAndFees add(ChargesAndFees that) {
return new ChargesAndFees(this.charges.add(that.charges),
this.fees.add(that.fees));
}
}
现在您可以执行流逻辑
ChargesAndFees totals = tableRowDataList.stream()
.map(el -> new ChargesAndFees(el.getSums().getCharges(),
el.getSums().getFees()))
.reduce(ChargesAndFees.ZERO, ChargesAndFees::add);
如果您坚持,那么您可以将总计
中的值转换为映射
如果您有一个对象列表,其中每个对象都有一个SUMMS对象——您是否控制TableRowDataElement和/或SUMMS的定义
如果在TableRowDataElement或Sums中创建add方法,则无需额外的类即可简化此过程--
尝试:
Optional res=streamx.of(tableRowDataList)
.map(e->e.getSums())
.mapToEntry(s->s.getCharges(),s->s.getFees())
.减少((a,b)->{
a、 getKey().add(b.getKey());
b、 getKey().add(b.getValue());
返回a;
});
我认为我们应该尽量避免创建那些小助手类。否则,您将遇到维护数十个/数百个小类的麻烦 我写的完全一样。这个案例需要一个专门处理总和的类。我认为ChargesAndFees
类可以使用toMap
方法来验证OP的要求。@JeremyGrand我的理解是,Map
的请求是一个XY问题,但我确实在最后添加了“如果你坚持”,OP应该能够在需要时编写它。谢谢@Andreas!地图确实是一个XY问题,现在我看到了你的方法。。。
Sums sums = tableRowDataList.stream()
.map(el -> el.getSums())
.reduce(new Sums(0,0), Sums::add);
Optional<Entry<BigDecimal, BigDecimal>> res = StreamEx.of(tableRowDataList)
.map(e -> e.getSums())
.mapToEntry(s -> s.getCharges(), s -> s.getFees())
.reduce((a, b) -> {
a.getKey().add(b.getKey());
b.getKey().add(b.getValue());
return a;
});