retainAll方法

void retainAll(
  1. Iterable<Object?> elements
)
override

删除此集合中不在elements中的所有元素。

检查elements中的每个元素,看此集合中是否有与其相等的元素(根据this.contains),如果有,则在集合中保留相等的元素,并删除与elements中任何元素不相等的元素。

final characters = <String>{'A', 'B', 'C'};
characters.retainAll({'A', 'B', 'X'});
print(characters); // {A, B}

实现

void retainAll(Iterable<Object?> elements) {
  // Build a set with the same sense of equality as this set.
  SplayTreeSet<E> retainSet = SplayTreeSet<E>(_compare, _validKey);
  int modificationCount = _modificationCount;
  for (Object? object in elements) {
    if (modificationCount != _modificationCount) {
      // The iterator should not have side effects.
      throw ConcurrentModificationError(this);
    }
    // Equivalent to this.contains(object).
    if (_validKey(object) && _splay(object as E) == 0) {
      retainSet.add(_root!.key);
    }
  }
  // Take over the elements from the retained set, if it differs.
  if (retainSet._count != _count) {
    _root = retainSet._root;
    _count = retainSet._count;
    _modificationCount++;
  }
}