当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Dart Iterable用法及代码示例


dart:core 库中Iterable 类的用法介绍如下。

可以按顺序访问的值集合或 "elements"。

通过使用iterator getter 获取Iterator 并使用它来逐步遍历值来访问可迭代的元素。通过调用 Iterator.moveNext 来完成迭代器的步进,如果调用返回 true ,则迭代器现在已移动到下一个元素,该元素随后可用作 Iterator.current 。如果调用返回 false ,则没有更多元素。仅当最近对 Iterator.moveNext 的调用返回 true 时,才必须使用 Iterator.current 值。如果在迭代器上第一次调用 Iterator.moveNext 之前使用它,或者在调用返回 false 或抛出错误之后,读取 Iterator.current 可能会抛出或返回任意值。

您可以从同一个 Iterable 创建多个迭代器。每次读取iterator 时,它都会返回一个新的迭代器,并且可以独立地单步执行不同的迭代器,每个迭代器都可以访问可迭代对象的所有元素。相同可迭代should 的迭代器以相同的顺序提供相同的值(除非在迭代之间修改了底层集合,某些集合允许这样做)。

您还可以使用 for-in 循环构造迭代 Iterable 的元素,该循环构造在幕后使用 iterator getter。例如,您可以迭代 Map 的所有键,因为 Map 键是可迭代的。

var kidsBooks = {'Matilda': 'Roald Dahl',
                 'Green Eggs and Ham': 'Dr Seuss',
                 'Where the Wild Things Are': 'Maurice Sendak'};
for (var book in kidsBooks.keys) {
  print('$book was written by ${kidsBooks[book]}');
}

ListSet 类都是 Iterable ,就像 dart:collection 库中的大多数类一样。

可以修改一些Iterable 集合。向 ListSet 添加元素将更改其包含的元素,向 Map 添加新键会更改 Map.keys 的元素。更改后创建的迭代器将提供新元素,并且可能会或可能不会保留现有元素的顺序(例如,HashSet 可能会在添加单个元素时完全改变其顺序)。

更改正在迭代的集合while 通常是允许的not。这样做会中断迭代,这通常通过在下次调用 Iterator.moveNext 时抛出 ConcurrentModificationError 来表示。 Iterator.current getter 的当前值不应受到集合更改的影响,current 值是由先前对 Iterator.moveNext 的调用设置的。

一些可迭代对象在每次迭代时都会动态计算其元素,例如 Iterable.generate 返回的元素或 sync* 生成器函数返回的可迭代对象。如果计算不依赖于其他可能发生变化的对象,那么每次迭代生成的序列都应该是相同的。

Iterable 的成员,除了 iterator 本身之外,通过查看可迭代的元素来工作。这可以通过运行 iterator 来实现,但某些类可能有更有效的方法来查找结果(例如 List 上的 lastlength ,或 Set 上的 contains )。

返回另一个 Iterable (如 mapwhere )的方法都是 lazy - 每次迭代返回的可迭代对象时,它们都会迭代原始的(根据需要),而不是之前。

由于一个可迭代对象可能被多次迭代,因此不建议在迭代器中使用可检测的side-effects。对于像 mapwhere 这样的方法,返回的迭代将在每次迭代时执行参数函数,因此这些函数也不应该有副作用。


实施者

DoubleLinkedQueue IterableBase IterableMixin LinkedList List ListQueue Queue Runes Set

可用的扩展

EnumByName

相关用法


注:本文由纯净天空筛选整理自dart.dev大神的英文原创作品 Iterable<E> class。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。