【问题标题】:What is the ObservableSet equivalent for setAll() method from ObservableListObservableList 中 setAll() 方法的 ObservableSet 等效项是什么
【发布时间】:2014-09-08 01:32:25
【问题描述】:

我应该在 JavaFX ObservableSet 集合的设置器中使用什么方法来清除集合并将其初始化为给定的集合? ObservableList 具有 setAll(Collection) 方法,用于通过首先清除列表来初始化列表。

我见过的最接近的是addAll(Collection),它没有事先清除集合。在我的项目中设置集合时,我希望它具有将 ObservableSet 设置为新集合的正常行为,但根据 javadoc:

如果指定集合中的所有元素尚不存在,则将它们添加到此集合中(可选操作)。如果指定的集合也是一个集合,addAll 操作会有效地修改这个集合,使其值是两个集合的并集。

我不能只使用= 设置值,因为在setter 中传递的参数是一个集合,而ObservableSet 是外部一无所知的内部包装器。我也想避免clear 然后addAll

【问题讨论】:

    标签: java collections javafx java-8


    【解决方案1】:

    正如您在ObservableSet 的Javadoc 中看到的,没有这样的方法。

    其实ObservableList::setAll这个方法只是一个方便的“捷径”:

    清除 ObservableList 并添加集合中的所有元素。

    JavaFX 中的常见实现ModifiableObservableListBase 执行clear 然后是addAll

    @Override
    public boolean setAll(Collection<? extends E> col) {
        beginChange();
        try {
            clear();
            addAll(col);
        } finally {
            endChange();
        }
        return true;
    }
    

    拥有setAll 快捷方式的主要优点是只有一个“大”change event (ListChangeListener.Change) 被发送给听众。更好的性能。

    事实上,您可能想用自己的setAll 扩展com.sun.javafx.collections.ObservableSetWrapper,但不会有性能优势,因为事件SetChangeListener.Change 是一个基本更改m 删除了事件, 并发送n 添加的事件。

    所以你别无选择:

    set.clear();
    set.addAll(otherSet);
    

    或复制一个新的集合并分配:

    set = FXCollections.observableSet(otherSet);
    

    【讨论】:

    • 谢谢,只是想确保 ObservableSet 不会被强制转换来公开这样的方法。 set = FXCollections.observableSet(otherSet); 看起来最好,因为它具有可读性并且只触发一个事件
    猜你喜欢
    • 2014-09-08
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多