我正在努力与Bindings.when ...尝试创建一个百分比分数,该分数会在成功测试的次数发生变化(在下面的代码中反映为“successCountProperty”)或测试总数发生变化时进行更新(反映在“结果”的sizeProperty中)。当我执行此代码时,我得到了java.lang.ArithmeticException:/零。最初遇到异常时,我发现Bindings.when()。then()。otherwise()可以解决此问题。不幸的是,在执行此代码时,尽管'when'返回false,但仍在执行'then'。有人可以帮忙吗?

public void foo()
{
    DoubleProperty scoreProperty = new SimpleDoubleProperty(0);
    ListProperty<String> results = new SimpleListProperty<>(FXCollections.observableArrayList());

    IntegerProperty successCountProperty = new SimpleIntegerProperty(0);

    scoreProperty.bind(Bindings.when(results.sizeProperty().greaterThan(0))
            .then(Bindings.divide(successCountProperty, results.sizeProperty())).otherwise(0));
}

最佳答案

使用Bindings的方法或属性本身进行的更复杂的绑定很容易引起混淆,难以维护。

在这种情况下,我建议使用自定义评估方法创建DoubleBinding:

scoreProperty.bind(Bindings.createDoubleBinding(() -> {
    int size = results.size();
    return size == 0 ? 0d : ((double) successCountProperty.get()) / size;
}, results.sizeProperty(), successCountProperty));

10-05 18:33