2017-05-23 21 views
0

希望有人能幫助我。我有兩個POJO。一個發票頁眉和另一個用於細節如何將一個POJO的屬性綁定到一個內部ArrayList的字段之和<ANOTHER_POJO>

public class Invoice{ 
private SimpleStringProperty docNum; 
private SimpleStringProperty customer; 
private ArrayList<InvoiceDetails> invoiceDetails; 

public Invoice(String docNum, String customer) { 
    this.docNum = new SimpleStringProperty(docNum); 
    this.customer = new SimpleStringProperty(customer); 
    this.invoiceDetails= new ArrayList<>(); 
} 

/* Getters and setters*/ 
} 

第二個是...

public class InvoiceDetails{ 
private SimpleStringProperty taxRate; 
private SimpleDoubleProperty taxAmount; 
private SimpleDoubleProperty amount; 

public InvoiceDetails(String taxRate, Double taxAmount, Double amount) { 
    this.taxRate= new SimpleStringProperty(taxRate); 
    this.taxAmount= new SimpleDoubleProperty(taxAmount); 
    this.amount= new SimpleDoubleProperty(amount); 
} 

/* Getters and setters*/ 
} 

的問題是我怎麼能綁定POJO的領域Invoices,POJO InvoiceDetails的字段amount的總和。事情是這樣的:

public class Invoice{ 
private SimpleStringProperty docNum; 
private SimpleStringProperty customer; 
private ArrayList<InvoiceDetails> invoiceDetails; 
private SimpleDoubleProperty totalAmount; 

public Invoice(String docNum, String customer) { 
    this.docNum = new SimpleStringProperty(docNum); 
    this.customer = new SimpleStringProperty(customer); 
    this.invoiceDetails= new ArrayList<>(); 
    this.totalAmount.bind(....) 
} 

/* Getters and setters*/ 
} 

這將是更好的方式來實現這一目標。也許收集流中的數據並綁定到字段totalAmount? 預先感謝您的時間。

+0

'totalAmount'應該是每個'InvoiceDetail'每個'amount'的總和? – XtremeBaumer

+0

是的,讓我們取一個Invoice包含3個InvoiceDetails的ArrayList,其值爲amount; 1,2和3. _parent_ POJO'Invoice'中的總額應該是6. – pburgov

回答

1

我認爲你可以只擴展一個List(該例子顯示了ArrayList擴展),並更改列表成員變化的字段。

public class DemoList { 
    public static void main(String[] args) throws Exception { 
     DetailList list = new DetailList(); 
     Invoice i = new Invoice(list); 

     System.out.println(i.getTotalAmount()); 

     list.add(new Details(42)); 
     list.add(new Details(42)); 
     System.out.println(i.getTotalAmount()); 
     list.remove(0); 
     System.out.println(i.getTotalAmount()); 
    } 

} 

class Invoice { 
    final DetailList details; 

    public Invoice(DetailList details) { 
     this.details = details; 
    } 

    public int getTotalAmount() { 
     return details.getTotalAmount(); 
    } 
} 
class Details { 
    final int amount; 

    public Details(int amount) { 
     this.amount = amount; 
    } 
} 
class DetailList extends ArrayList<Details> { 
    int totalAmount=0; 
    public DetailList() { 
    } 

    @Override 
    public boolean add(Details t) { 
     boolean res = super.add(t); 
     recalculateTotal(); 
     return res; 
    } 

    @Override 
    public void add(int index, Details element) { 
     super.add(index, element); 
     recalculateTotal(); 
    } 

    @Override 
    public Details remove(int index) { 
     Details res = super.remove(index); 
     recalculateTotal(); 
     return res; 
    } 

    @Override 
    public boolean remove(Object o) { 
     boolean res = super.remove(o); 
     recalculateTotal(); 
     return res; 
    } 

    private void recalculateTotal() { 
     totalAmount=0; 
     this.stream().forEach(item -> { 
      totalAmount+=item.amount; 
     }); 
    } 
    public int getTotalAmount() { 
     return totalAmount; 
    } 
} 
+0

不錯的主意,但我不會總是調用重新計算。當添加一個新的Detail時,你可以簡單地執行'totalAmount + = item.amount',並且當移除一個元素'totalAmount- = item.amount'時。只有你應該調用重新計算的情況是當你改變一個'Detail'的數量(這應該是可能的(不是最終的))。否則它只處理不需要處理的時間 – XtremeBaumer

+0

@XtremeBaumer我同意。計算差異更容易。這個例子是簡化的例子。金額應該是最終的,或者我們應該添加相同的邏輯(通知重新計算總計的更改)到Details類。 – StanislavL

+0

是啊,如果你改變了你必須通知它的金額。我認爲有些情況下應該可以改變金額 – XtremeBaumer

0

謝謝大家爲你的時間。我終於找到了另一個我認爲更簡單的解決方案。 我將SimpleDoubleProperty totalAmount綁定到DoubleBinding,這是通過ArrayList<InvoiceDetails> invoiceDetails的流的結果。

public class Invoice{ 
    private SimpleStringProperty docNum; 
    private SimpleStringProperty customer; 
    private ArrayList<InvoiceDetails> invoiceDetails; 
    private SimpleDoubleProperty totalAmount; 

    public Invoice(String docNum, String customer) { 
     this.docNum = new SimpleStringProperty(docNum); 
     this.customer = new SimpleStringProperty(customer); 
     this.invoiceDetails= new ArrayList<>(); 
    } 

    /* Getters and setters */ 
    public SimpleDoubleProperty totalAmountProperty() { 
      if (this.totalAmount == null) { 
      this.totalAmount = new SimpleDoubleProperty(); 
      } 
     DoubleBinding ta = new DoubleBinding() { 
     @Override 
     protected double computeValue() { 
      Double result = detalleIvaList.stream() 
      .mapToDouble(DetalleIva::getBaseImponible).reduce(0.0, Double::sum); 
      return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue(); 
     } 
     }; 
     this.totalAmount.bind(ta); 
     return this.totalAmount; 
    } 

    public Double getTotalAmount() { 
     return this.totalAmountProperty().get(); 
    } 

    public void setTotalAmount(Double totalAmount) { 
     this.totalAmountProperty().set(totalAmount); 
    } 

再次感謝您的時間。 Regards

相關問題