当我有一个可观察的列表,并且想要在添加或删除元素时执行某些操作时,我发现自己经常执行以下代码模式:
ObservableList<String> myDynamicList = FXCollections.observableArrayList();
myDynamicList.add("My string 1");
myDynamicList.add("My string 2");
<...>
Consumer<String> onElementAdded = s -> {
logger.info("Added: " + s);
};
Consumer<String> onElementRemoved = s -> {
logger.info("Removed: " + s);
};
// Follow list insertions & removals in the future
myDynamicList.addListener((ListChangeListener<? super String>) c -> {
while(c.next()) {
c.getAddedSubList().forEach(onElementAdded);
c.getRemoved().forEach(onElementRemoved);
}
});
// "Synchronize" the initial state - call the same handler for all already inserted elements
myDynamicList.forEach(onElementAdded);
这种方法存在问题:
onElementAdded
消费者定义为变量,以便在addListener
和forEach
调用中使用。即,我无法直接在addListener
参数中定义行为(可以更简洁)。onElementAdded
更改addListener
时,请不要忘记在forEach
中执行相同操作)addListener
还是forEach
。我认为,如果列表仅由一个线程修改,这并不重要,如果不是这样,那么无论如何都会破坏。但还是...... 所以问题是,是否有更好的方法将侦听器绑定到可观察列表,并为所有现有元素调用相同的侦听器,就好像它们是否刚刚添加到列表中一样?