ObservableList中setAll()方法的ObservableSet等价物是什么

时间:2014-07-17 09:00:24

标签: java collections javafx java-8

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

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

  

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

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

1 个答案:

答案 0 :(得分:2)

正如您在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)被发送给听众。更好的表现。

事实上,您可能希望使用自己的com.sun.javafx.collections.ObservableSetWrapper扩展setAll,但由于事件SetChangeListener.Change基本更改,因此不会带来任何性能优势:m删除了活动,并发送了n个已添加的活动。

所以你别无选择:

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

或复制一个新集并指定:

set = FXCollections.observableSet(otherSet);