forEachEntry方法
- void action(
- DoubleLinkedQueueEntry<
E> element
- DoubleLinkedQueueEntry<
对双链队列的每个条目对象调用action
。
队列中的每个元素都关联一个DoubleLinkedQueueEntry。此方法从第一个到最后一个迭代条目对象,并依次使用每个对象调用action
。
可以使用firstEntry和lastEntry访问条目对象,并使用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!;
}
}
}