2017-05-23 2 views
0

hoffe jemand kann mir helfen. Ich muss zwei POJOs, eine für den Rechnungskopf und eine weitere für die DetailsWie bindet man eine Eigenschaft eines POJO an die Summe des Feldes einer inneren 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*/ 
} 

das zweite ist ...

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*/ 
} 

Die Frage ist, wie kann ich ein Feld der POJO binden Invoices, zur Summe des Feldes amount des POJO InvoiceDetails. Etwas wie dieses:

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*/ 
} 

Welches wäre der bessere Weg, dies zu erreichen. Vielleicht die Daten in einem Stream sammeln und an das Feld totalAmount binden? Vielen Dank im Voraus für Ihre Zeit.

+0

'totalAmount' sollte die Summe von jeder' Menge' von 'InvoiceDetail' sein? – XtremeBaumer

+0

Ja, lassen Sie uns eine Rechnung haben eine ArrayList von 3 InvoiceDetails mit dem Betragswert; 1,2 und 3. Der totalAmount in der _parent_ POJO 'Rechnung' sollte 6 sein. – pburgov

Antwort

1

Ich denke, Sie können nur eine Liste erweitern (das Beispiel zeigt ArrayList Erweiterung) und ändern Sie das Feld auf Listenmitglieder Änderungen.

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

nette Idee, aber ich würde nicht immer neu berechnen. Wenn Sie ein neues Detail hinzufügen, können Sie einfach "totalAmount + = item.amount" und beim Entfernen eines Elements "totalAmount- = item.amount" verwenden. Der einzige Fall, den Sie neu berechnen sollten, ist, wenn Sie den Betrag eines 'Details' ändern (was möglich sein sollte (nicht endgültig)). sonst dauert es nur Bearbeitungszeit, wo es nicht benötigt wird – XtremeBaumer

+0

@XtremeBaumer Ich stimme zu. Es ist einfacher, Diff zu berechnen. Das Beispiel ist vereinfacht. Der Betrag sollte endgültig sein oder wir sollten die gleiche Logik (Benachrichtigung über Änderungen bei der Neuberechnung der Gesamtsumme) zur Klasse Details hinzufügen. – StanislavL

+0

Ja, wenn Sie den Betrag ändern, müssen Sie darüber informieren. Ich denke, es gibt einige Fälle, in denen der Betrag geändert werden könnte – XtremeBaumer

0

Vielen Dank für Ihre Zeit. Ich habe schließlich eine andere Lösung gefunden, die meiner Meinung nach einfacher ist. Ich binde die SimpleDoubleProperty totalAmount an eine DoubleBinding, und diese ist das Ergebnis eines Stream durch die 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); 
    } 

Nochmals vielen Dank für Ihre Zeit. Grüße

Verwandte Themen