2017-06-01 30 views
1

我想要合并和总结(具体属性)两个相同Domain对象的ArrayList。基于多个属性匹配的条件,然后将它们合并为一个。组合对象的ArrayList和Java中的BigDecimal的总和

这里是我的模型类

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,true,6.600
  • VAT_2,9.000,虚假,9.500
  • VAT_3,7.000,真实,1.000

使用Java 8,也许Lambda表达式是要走的路?感谢您的任何建议。

+0

什么是'SampleModel'类? – Yahya

+0

@Yahya这是我的错误 - 纠正。 – SiriusBits

回答

4

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你可以验证使用filter()方法从Java 8

代码检查验证:

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 
+0

这是一个很好的解决方案! – Yahya

+0

谢谢@Yahya :) –

+0

优秀的解决方案@JUANCALVOPINAM。这很好地使用了Lambda表达式。 – SiriusBits

0

你说

根据条件,如果两个属性相匹配,然后在 一个将它们组合起来。

但基于示例结果,您需要检查三个属性匹配。

public class SalesTransactionMerge { 

private List<SalesTransactionTax> taxes = null; 

public List<SalesTransactionTax> getTaxes(){ 
    return this.taxes; 
} 

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

public void add(SalesTransactionTax stt){ 
    SalesTransactionTax sttExists = exists(stt); 
    if(sttExists == null){ 
     this.taxes.add(stt); 
    } 
    else{ 
     sttExists.setTaxAmount(sttExists.getTaxAmount().add(stt.getTaxAmount())); 
    } 
} 

private SalesTransactionTax exists(SalesTransactionTax stt){ 
    SalesTransactionTax sttExists = null; 
    for(SalesTransactionTax stt2 : taxes){ 
     int matches = 0; 
     if(stt2.getCode().equals(stt.getCode())) matches++; 
     if(stt2.getRate().compareTo(stt.getRate()) == 0) matches++; 
     if(stt2.getIsFixed() == stt.getIsFixed()) matches++; 
     if(matches == 3){  
      sttExists = stt2; 
      break; 
     } 
    } 
    return sttExists; 
} 

public void print(){ 
    for(SalesTransactionTax stt : taxes){ 
     System.out.println(stt.toString()); 
    } 
} 
} 

使用你的例子

public static void main(String[] args) { 

    SalesTransactionMerge mergeTaxes = new SalesTransactionMerge(); 
    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(); 
} 
+0

更正措辞,感谢您的答复。 – SiriusBits