有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这种方法的问题:

  1. 代码混乱:我必须(至少)将onElementAdded消费者定义为变量,用于addListenerforEach调用。也就是说,我不能直接在addListener参数中定义行为(可以更简洁)
  2. 有两个调用需要保持一致(即,在addListener中更改onElementAdded时,不要忘记在forEach中执行相同的操作)
  3. 我总是怀疑是先打电话还是先打电话。我认为,如果列表只被一个线程修改,这并不重要,如果不被修改,它无论如何都会被破坏。但还是

所以问题是,有没有更好的方法将侦听器绑定到一个可观察列表,并为所有现有元素调用同一个侦听器,就好像它们刚刚被添加到列表中一样


共 (0) 个答案