forEachEntry 方法

void forEachEntry(
  1. void action(
    1. DoubleLinkedQueueEntry<E> element
    )
)

为这个双端队列的每个条目对象调用 action

队列中的每个元素都与一个 DoubleLinkedQueueEntry 相关联。此方法从第一个到最后一个遍历条目对象,并依次将每个对象与 action 一起调用。

条目对象也可以使用 firstEntrylastEntry 访问,并使用 DoubleLinkedQueueEntry.nextEntry()DoubleLinkedQueueEntry.previousEntry() 进行迭代。

action 函数可以使用 DoubleLinkedQueueEntry 上的方法删除条目,或者可以在条目前后插入元素。如果当前条目被删除,迭代将继续到 action 被调用时当前条目之后的条目。在删除当前元素之前插入的任何元素都不会被迭代访问。

实现

void forEachEntry(void action(DoubleLinkedQueueEntry<E> element)) {
  var cursor = _sentinel._nextLink!;
  while (true) {
    var element = cursor._asNonSentinelEntry();
    if (element == null) break;
    if (!identical(element._queue, this)) {
      throw ConcurrentModificationError(this);
    }
    cursor = cursor._nextLink!;
    // Remember both element and element._nextLink (as cursor).
    // If someone calls `element.remove()` we continue from `next`.
    // Otherwise we use the value of element._nextLink which may have been
    // updated.
    action(element);
    if (identical(this, element._queue)) {
      cursor = element._nextLink!;
    }
  }
}