【问题标题】:Sum List of BigDecimalBigDecimal 的求和列表
【发布时间】:2015-10-16 10:19:50
【问题描述】:

我正在开发一个使用 Spring、Maven 和 Java 7 的项目。

我有一个包含 bigdecimal 的列表,并且必须总结列表中的所有元素。我知道使用 for 循环我们可以如下所示,

List<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal(10.333));
list.add(new BigDecimal(14.333));
BigDecimal result = new BigDecimal(0);
for (BigDecimal b : list) {
     result = result.add(b);
}

有没有更好的方法?使用 google gauva FluentIterable 或 apache ArrayUtils/StatUtils?

【问题讨论】:

  • @kkkkk 是的。那就是 BigDecimal.add()。我想迭代列表并添加。所以我想像 api FluentIterable 那样做一些事情
  • 我认为您的解决方案简洁明了。你为什么要改变它?也许你应该选择 Java 8 及其 Stream API
  • 一个小改进:BigDecimal result = BigDecimal.ZERO;。否则,你的代码是好的。
  • @Flown 是的,我知道 java 8 中的 Stream。但我现在无法将我的应用程序迁移到 java 8。正如我所说,我想使用一些像 FluentIterable 这样的想法
  • 当在 String list.add(new BigDecimal("10.333"))上使用构造函数时;` BigDecimal 会知道 3 的精度,并且总和是正确的。暂时您将双精度数的近似误差导入总和。对于这个问题:没有更好的方法,因为 BigDecimal 是不可变的。 Java 8 将允许并行添加流。

标签: java list collections java-7


【解决方案1】:

这是一种仅使用 Java 8 和流的方法:

List<BigDecimal> list = Arrays.asList(new BigDecimal(10.333), //
   new BigDecimal(14.333));
BigDecimal result = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

【讨论】:

    【解决方案2】:

    如果您不能使用 Java 8 lambda 或 Groovy 闭包,在这种情况下,您可以编写一个单行代码来替换您的四行代码,那么您的代码就非常清晰了。使用基于库的迭代工具几乎肯定会使代码更复杂, 肯定会使它变慢。你让它变得尽可能简单;没关系。

    【讨论】:

    • 没错。好吧,将初始值new BigDecimal(0) 替换为BigDecimal.ZERO,仅此而已。没有什么需要改进的了……
    【解决方案3】:

    如果您不介意额外的第三方库依赖,那么Eclipse Collections 中有解决此问题的方法。

    List<BigDecimal> list =
        Lists.mutable.with(
            new BigDecimal("10.333"),
            new BigDecimal("14.333"));
    
    Assert.assertEquals(
        new BigDecimal("24.666"),
        Iterate.sumOfBigDecimal(list, Functions.getPassThru()));
    

    由于您已经有一个 BigDecimal 列表,因此应用于每个的函数只会传递值。

    注意:我是 Eclipse Collections 的提交者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多