有没有办法让听众一旦开火并自行移除?
for(Spec spec : specs){
spec.myProperty().addListener((obs,ov,nv) -> {
if (nv.longValue() > 0){
//do whatever
spec.myProperty().removeListener(this);
}
});
}
该代码不起作用。我只能想到这个看似简单问题的复杂解决方案。
答案 0 :(得分:1)
如何使用匿名内部类而不是lambda表达式?
IntegerProperty property = new SimpleIntegerProperty();
InvalidationListener listener = new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
//TODO do something
property.removeListener(this);
}
};
property.addListener(listener);
答案部分在评论中,所以我会在这里添加我的[brian]解决方案。
public void someMethod(){
for(Spec spec : specs){
spec.myProperty().addListener(listener);
}
}
ChangeListener<Number> listener = new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> obs, Number ov, Number nv) {
Spec spec = (Spec)((SimpleLongProperty)obs).getBean();
spec.myProperty().removeListener(this);
}
};
注意,当我在Spec类中创建myProperty时,我使用完整的构造函数来指定bean。 new SimpleLongProperty(this, "myProperty", 0l);
即使这样做,您仍然无法使用lambda删除this
。