java ObservableList:addListener后跟foreach
当我有一个可观察的列表,并想在添加或删除元素时做一些事情时,我发现自己经常做以下代码模式:
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
参数中定义行为(可以更简洁)李> - 有两个调用需要保持一致(即,在
addListener
中更改onElementAdded
时,不要忘记在forEach
中执行相同的操作) - 我总是怀疑是先打电话还是先打电话。我认为,如果列表只被一个线程修改,这并不重要,如果不被修改,它无论如何都会被破坏。但还是李>
所以问题是,有没有更好的方法将侦听器绑定到一个可观察列表,并为所有现有元素调用同一个侦听器,就好像它们刚刚被添加到列表中一样
共 (0) 个答案