java - 结合对象的 ArrayList 并在 Java 中对 BigDecimal 求和

标签 java arraylist spring-boot lambda

我想合并两个相同域对象的 ArrayList 并对其求和(特定属性)。根据多个属性匹配的条件,然后将它们合并为一个。

这是我的模型类

public class SalesTransactionTax {

  private String code;
  private BigDecimal rate;
  private Boolean isFixed;
  private BigDecimal taxAmount;

  public SalesTransactionTax(String code, BigDecimal rate, Boolean isFixed, BigDecimal taxAmount) { // NO_UCD
                                                                                                    // (unused
    // code)

    this.code = code;
    this.rate = rate;
    this.isFixed = isFixed;
    this.taxAmount = taxAmount;
  }

  public SalesTransactionTax() {

  }

  public String getCode() {

    return code;
  }

  public void setCode(String code) {

    this.code = code;
  }

  public BigDecimal getRate() {

    return rate;
  }

  public void setRate(BigDecimal rate) {

    this.rate = rate;
  }

  public Boolean getIsFixed() {

    return isFixed;
  }

  public void setFixed(Boolean fixed) {

    isFixed = fixed;
  }

  public BigDecimal getTaxAmount() {
    return taxAmount;
  }

  public void setTaxAmount(BigDecimal taxAmount) {
    this.taxAmount = taxAmount;
  }

  @Override
  public String toString() {
    return "SalesTransactionTax [code=" + code + ", rate=" + rate + ", isFixed=" + isFixed
        + ", taxAmount=" + taxAmount + "]";
  }

}

以下面为例:

List<SalesTransactionTax> taxes  = new ArrayList<>();

taxes.add(new SalesTransactionTax("VAT_1", 5.000, true, 1.100));
taxes.add(new SalesTransactionTax("VAT_1", 5.000, true, 1.100));
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200));
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200));
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200));
taxes.add(new SalesTransactionTax("VAT_2", 9.000, false, 9.500));
taxes.add(new SalesTransactionTax("VAT_3", 7.000, true, 1.000));

新 ArrayList 中的值将是:

  • VAT_1,5.000,正确,2.200
  • VAT_2,9.000,正确,6.600
  • VAT_2、9.000、假、9.500
  • VAT_3,7.000,正确,1.000

使用 Java 8,也许 Lambda 表达式是可行的方法?感谢您的任何建议。

最佳答案

add (...) 方法应该具有对税额求和的逻辑,为此,有必要检查新交易是否符合已建立的验证。

验证应该具有相同的:getCode()、getRate()、getIsFixed()

要添加的代码段:

public void add(SalesTransactionTax inputValue) {
    SalesTransactionTax salesTransactionTax = checkInList(inputValue);
    if (salesTransactionTax != null) {
        // To sum operations the method used is add() from BigDecimal
        salesTransactionTax.setTaxAmount(salesTransactionTax.getTaxAmount().add(inputValue.getTaxAmount()));
    } else {
        this.salesTransactionTaxList.add(inputValue);
    }
}

要检查列表中是否存在新的 SalesTransactionTax,您可以使用 Java 8 中的 filter() 方法进行验证

检查验证的代码片段:

private SalesTransactionTax checkInList(SalesTransactionTax stt) {
    return salesTransactionTaxList.stream()
            // To compare String is used equals()
            .filter(stt2 -> stt2.getCode().equals(stt.getCode()))
            // To compare BigDecimal is used compareTo()
            .filter(stt2 -> stt2.getRate().compareTo(stt.getRate()) == 0)
            // To compare boolean is used ==
            .filter(stt2 -> stt2.getIsFixed() == stt.getIsFixed())
            // If doesn't exist return null
            .findAny().orElse(null);
}

完整示例:

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class SalesTransactionTax {

    private String code;
    private BigDecimal rate;
    private Boolean isFixed;
    private BigDecimal taxAmount;
    private List<SalesTransactionTax> salesTransactionTaxList = null;

    public SalesTransactionTax(String code, BigDecimal rate, Boolean isFixed, BigDecimal taxAmount) { // NO_UCD
        this.code = code;
        this.rate = rate;
        this.isFixed = isFixed;
        this.taxAmount = taxAmount;
    }

    public SalesTransactionTax() {
        this.salesTransactionTaxList = new ArrayList<>();
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public BigDecimal getRate() {
        return rate;
    }

    public void setRate(BigDecimal rate) {
        this.rate = rate;
    }

    public Boolean getIsFixed() {
        return isFixed;
    }

    public void setFixed(Boolean fixed) {
        isFixed = fixed;
    }

    public BigDecimal getTaxAmount() {
        return taxAmount;
    }

    public void setTaxAmount(BigDecimal taxAmount) {
        this.taxAmount = taxAmount;
    }

    public void add(SalesTransactionTax inputValue) {
        SalesTransactionTax salesTransactionTax = checkInList(inputValue);
        if (salesTransactionTax != null) {
            // To sum operations the method used is add() from BigDecimal
            salesTransactionTax.setTaxAmount(salesTransactionTax.getTaxAmount().add(inputValue.getTaxAmount()));
        } else {
            this.salesTransactionTaxList.add(inputValue);
        }
    }

private SalesTransactionTax checkInList(SalesTransactionTax stt) {
    return salesTransactionTaxList.stream()
            // To compare String is used equals()
            .filter(stt2 -> stt2.getCode().equals(stt.getCode()))
            // To compare BigDecimal is used compareTo()
            .filter(stt2 -> stt2.getRate().compareTo(stt.getRate()) == 0)
            // To compare boolean is used ==
            .filter(stt2 -> stt2.getIsFixed() == stt.getIsFixed())
            // If doesn't exist return null
            .findAny().orElse(null);
}

    public void print() {
        salesTransactionTaxList.forEach(System.out::println);
    }

    @Override
    public String toString() {
        //Output formatted
        DecimalFormat df = new DecimalFormat("#,###.000");
        return code + ", " + df.format(new BigDecimal(String.valueOf(rate))) + ", " + isFixed + ", " + df.format(new BigDecimal(String.valueOf(taxAmount)));
    }

    public static void main(String[] args) {

        SalesTransactionTax mergeTaxes = new SalesTransactionTax();
        mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100)));
        mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100)));
        mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200)));
        mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200)));
        mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200)));
        mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), false, BigDecimal.valueOf(9.500)));
        mergeTaxes.add(new SalesTransactionTax("VAT_3", BigDecimal.valueOf(7.000), true, BigDecimal.valueOf(1.000)));
        mergeTaxes.print();
    }

}

输出:

VAT_1, 5.000, true, 2.200
VAT_2, 9.000, true, 6.600
VAT_2, 9.000, false, 9.500
VAT_3, 7.000, true, 1.000

关于java - 结合对象的 ArrayList 并在 Java 中对 BigDecimal 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318212/

相关文章:

java - 从 Map 中设置数组列表中的值

java - getDifference(ArrayList<String> 一, ArrayList<String> 二) 方法

java - 来自 SQL View 的嵌套 JSON 响应

java - 找不到类 java.util.logging.ErrorManager 的序列化程序,也没有发现用于创建 BeanSerializer 的属性

java - 带有@RefreshScope @PostConstruct @PreDestroy 的 Spring 启动

java - Java 中的相对路径

java - 检查数组是否为空时出现 NullPointerException

java - 在单行中打印 arraylist 中的每个数组项

java - Android studio 始终使用 JDK 7,不要切换到 JDK 8

java - 尝试安装 rJava 但错误提示 JDK 不完整