Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将多个大小数相加到一个映射<;字符串,BigDecimal>;_Java_Sum_Java Stream_Bigdecimal - Fatal编程技术网

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;
            });