Iterable<E>抽象 混合

可以按顺序访问值的集合或“元素”。

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

可以从同一个Iterable创建多个迭代器。每次读取iterator时,它都会返回一个新的迭代器,并且不同的迭代器可以独立遍历,每个都提供了对可迭代所有元素的访问。同一个可迭代的迭代器应当提供相同顺序的值(除非在迭代之间修改了底层集合,这在一些集合中是允许的)。

您还可以使用for-in循环结构迭代可迭代的元素,该循环结构在后台使用iterator获取器。例如,您可以遍历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添加单个元素时,其顺序可能会完全改变)。

在迭代集合时更改集合通常是不允许的。这样做会中断迭代,这通常是在下一次调用Iterator.moveNext时通过抛出ConcurrentModificationError来表示的。Iterator.current获取器的当前值不应受集合更改的影响,而是Iterator.current值由之前的调用Iterator.moveNext设置为。

某些可迭代对象在每次迭代时都会动态计算它们的元素,就像由Iterable.generate返回的或由sync*生成器函数返回的迭代器一样。如果计算不依赖于可能更改的其他对象,则生成的序列在每次迭代时应该是相同的。

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

返回另一个 Iterable(如 mapwhere)的方法都是 惰性的 - 它们将在每次迭代返回的可迭代对象时迭代原始的(如必要),而不是在此之前。

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

Iterable 声明提供了一个默认实现,可以扩展或混合进来实现 Iterable 接口。它实现了除了 iterator 属性获取器以外的每个成员,使用由 iterator 提供的 Iterator。当可以做到时,应该为 Iterable 接口提供成员的更有效率的实现。

实现者
可用的扩展

构造函数

Iterable()
const
Iterable.empty()
创建一个空的可迭代对象。
const
factory
Iterable.generate(int count, [E generator(int index)?])
创建一个动态生成其元素的 Iterable
factory

属性

first → E
第一个元素。
没有设置器
hashCode int
此对象的哈希码。
没有设置器继承
isEmpty bool
此集合是否有元素。
没有设置器
isNotEmpty bool
此集合至少有一个元素。
没有设置器
iterator Iterator<E>
一个新的 Iterator,允许迭代此 Iterable 的元素。
没有设置器
last → E
最后一个元素。
没有设置器
length int
此中元素的数量。
没有设置器
runtimeType Type
对象的运行时类型的表示。
没有设置器继承
single → E
检查此可迭代对象只有一个元素,并返回该元素。
没有设置器

方法

any(bool test(E element)) bool
检查此可迭代的任何元素是否满足 test
cast<R>() Iterable<R>
将此可迭代作为 R 实例的可迭代的视图。
contains(Object? element) bool
该集合是否包含与 element 相等的元素。
elementAt(int index) → E
返回第 index 个元素。
every(bool test(E element)) bool
检查此可迭代的每个元素是否满足 test
expand<T>(Iterable<T> toElements(E element)) Iterable<T>
将此 Iterable 的每个元素展开为零个或多个元素。
firstWhere(bool test(E element), {E orElse()?}) → E
满足给定谓词 test 的第一个元素。
fold<T>(T initialValue, T combine(T previousValue, E element)) → T
通过迭代将集合的每个元素与现有值组合来将集合缩减为单个值。
followedBy(Iterable<E> other) Iterable<E>
创建此可迭代和 other 的惰性连接。
forEach(void action(E element)) → void
按照遍历顺序,对该可迭代集合的每个元素执行 action 操作。
join([String separator = ""]) String
将每个元素转换为 String 并拼接字符串。
lastWhere(bool test(E element), {E orElse()?}) → E
满足给定谓词 test 的最后一个元素。
map<T>(T toElement(E e)) Iterable<T>
通过 toElement 修改的当前可迭代集合元素。
noSuchMethod(Invocation invocation) → dynamic
在访问不存在的方法或属性时调用。
继承的
reduce(E combine(E value, E element)) → E
通过迭代使用提供的函数组合集合的元素,将集合缩减为单个值。
singleWhere(bool test(E element), {E orElse()?}) → E
满足 test 的单个元素。
skip(int count) Iterable<E>
创建一个 Iterable,其中不包含前 count 个元素。
skipWhile(bool test(E value)) Iterable<E>
创建一个在满足 test 时跳过前导元素的 Iterable
take(int count) Iterable<E>
创建一个懒迭代器,包含此迭代器的前count个元素。
takeWhile(bool test(E value)) Iterable<E>
创建一个懒迭代器,包含满足test的所有前面的元素。
toList({bool growable = true}) List<E>
创建一个包含此迭代器元素的列表
toSet() Set<E>
创建一个包含与此迭代器相同元素的集合
toString() String
返回this中(一些)元素的字符串表示。
覆盖
where(bool test(E element)) Iterable<E>
创建一个新的懒迭代器,包含所有满足谓词test的元素。
whereType<T>() Iterable<T>
创建一个新的懒迭代器,包含所有具有类型T的元素。

操作符

operator ==(Object other) bool
等价操作符。
继承的

静态方法

castFrom<S, T>(Iterable<S> source) Iterable<T>
source适配为Iterable<T>
iterableToFullString(Iterable iterable, [String leftDelimiter = '(', String rightDelimiter = ')']) String
将Iterable对象转换为字符串。
iterableToShortString(Iterable iterable, [String leftDelimiter = '(', String rightDelimiter = ')']) String
将Iterable对象转换为类似 Iterable.toString 的字符串。