我正在try 创建一个包含LineItem个金额的列表的绑定,行如下:

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();
        }
        
}
    

理想情况下,对属性的更改将反映在总属性中...

推荐答案

要实现这一点,需要进行一些更改:

  1. 您需要在LineItem类中定义一个"property accessor"方法,以访问实际的ObjectProperty<BigDecimal>(而不仅仅是它包装的BigDecimal).这允许列表在单个金额发生变化时发送通知.
  2. 您需要使用"extractor"创建ObservableList,以便在单个金额属性更改时,它可以向您的绑定发送更新通知
  3. 修复绑定中的函数以对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相关问答推荐

如何让TaskView总是添加特定的列来进行排序?

为什么JFrame paint()多次绘制同一点(或根本不绘制)?

如何使用解析器组合子解析Java数组类型签名?

取消按钮,但没有任何操作方法引发和异常

缩小画布比例后更改滚动窗格的内部大小

Java函数式编程中的双值单值映射

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

如何创建同一类的另一个对象,该对象位于变量中?

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

为什么使用JDK21获取锁定锁比使用JDK11慢

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

从Spring6中的JPMS模块读取类时出现问题

在打开搜索结果时,如何让Eclipse打开整个文件?

如何使JOOQ渐变脚本不重新创建表未更改的类?

获取月份';s在java中非UTC时区的开始时间和结束时间

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

Jackson YAML:支持锚点扩展/覆盖