ObservableList:addListener后跟foreach

时间:2016-06-06 08:30:28

标签: java javafx binding observablelist

当我有一个可观察的列表,并且想要在添加或删除元素时执行某些操作时,我发现自己经常执行以下代码模式:

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

这种方法存在问题:

  1. 代码混乱:我必须(至少)将onElementAdded消费者定义为变量,以便在addListenerforEach调用中使用。即,我无法直接在addListener参数中定义行为(可以更简洁)。
  2. 有两个电话需要保持一致(即,在onElementAdded更改addListener时,请不要忘记在forEach中执行相同操作)
  3. 我总是怀疑是先调用addListener还是forEach。我认为,如果列表仅由一个线程修改,这并不重要,如果不是这样,那么无论如何都会破坏。但还是......
  4. 所以问题是,是否有更好的方法将侦听器绑定到可观察列表,并为所有现有元素调用相同的侦听器,就好像它们是否刚刚添加到列表中一样?

0 个答案:

没有答案