gpt4 book ai didi

java - 创建 BigDecimal 列表的对象绑定(bind)以获取总计

转载 作者:行者123 更新时间:2023-12-02 18:08:50 24 4
gpt4 key购买 nike

我正在尝试使用以下行创建 LineItem 金额列表的绑定(bind):

ReadOnlyObjectWrapper<BigDecimal> total = new ReadOnlyObjectWrapper<>();

total.bind(Bindings.createObjectBinding(() -> items.stream()
.collect(Collectors.summingDouble(LineItem::getTotal)),
items));

显然,Collectors.summingDouble 不起作用,因为它是 BigDecimal。有没有办法用 BigDecimal 来做到这一点?

LineItem.java

public class LineItem
{
private final SimpleObjectProperty<BigDecimal> amount;

public LineItem()
{
this.amount = new SimpleObjectProperty<>();
}

public BigDecimal getTotal()
{
return this.amount.get();
}

}

理想情况下,对属性的更改将反射(reflect)在总属性中......

最佳答案

要实现此功能,需要进行一些更改:

  1. 您需要在 LineItem 中定义一个“属性访问器”方法类,访问实际的ObjectProperty<BigDecimal> (不仅仅是它包装的BigDecimal)。这允许列表在个别金额发生变化时发送通知。
  2. 您需要创建您的 ObservableList"extractor" ,因此如果单个金额属性发生更改,它可以向您的绑定(bind)发送更新通知
  3. 修复绑定(bind)中的函数以求和 BigDecimal实例,如 this question 中所述

这看起来像:

public class LineItem {
private final SimpleObjectProperty<BigDecimal> amount;

public LineItem()
{
this.amount = new SimpleObjectProperty<>();
}

public final BigDecimal getTotal()
{
return this.amount.get();
}

public ObjectProperty<BigDecimal> totalProperty() {
return amount ;
}

public final void setTotal(BigDecimal total) {
totalProperty().set(total);
}

}

然后

ObservableList<LineItem> items = FXCollections.observableArrayList(
item -> new Observable[] {item.totalProperty()}
);

total.bind(Bindings.createObjectBinding(() -> items.stream()
.map(LineItem::getTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add),
items));

关于java - 创建 BigDecimal 列表的对象绑定(bind)以获取总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72732622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com