Iterable<E> class

可以顺序访问的值或"元素"的集合.

可访问迭代器的元素,方法是使用迭代器 getter获取一个Iterator ,然后使用它逐步遍历值. 通过调用Iterator.moveNext完成迭代器的操作 ,如果调用返回true ,则迭代器现在已移至下一个元素,该元素可作为Iterator.current使用 . 如果调用返回false ,则没有其他元素. 仅当对Iterator.moveNext的最新调用返回true时,才应使用Iterator.current值. 如果在第一次在迭代器上调用Iterator.moveNext之前或在调用返回false或引发错误之后使用它,则读取Iterator.current可能会抛出或返回任意值.

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

您还可以使用for-in循环结构在Iterable的元素上进行迭代,该结构在幕后使用iterator getter. 例如,您可以遍历Map的所有键,因为Map键是可迭代的.

Map 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 getter的当前值不应受集合中的更改影响, current值是由对Iterator.moveNext的上一次调用设置的.

一些可迭代的对象每次迭代都动态地计算其元素,例如Iterable.generate返回的元素或sync*生成器函数返回的可迭代对象. 如果计算不依赖于可能更改的其他对象,则每次迭代时生成的序列都应该相同.

Iterable的成员(除了iterator本身之外)通过查看Iterable的元素来工作. 这可以通过遍历迭代器来实现,但是某些类可能具有更有效的查找结果的方式(例如List上的lastlengthSet上的contains ).

返回另一个Iterable (例如mapwhere )都是惰性的 -每次迭代返回的Iterable (而不是之前),它们将对原始对象(必要时)进行迭代.

由于一个Iterable可能会多次迭代,因此不建议在Iterator中具有可检测到的副作用. 对于mapwhere之类的方法,返回的iterable将在每次迭代时执行参数函数,因此这些函数也不应有副作用.

Implementers

Constructors

Iterable()
const
Iterable.empty()
Creates an empty iterable. [...]
const
factory
Iterable.generate(int count, [E generator(int index)])
创建一个Iterable ,该Iterable动态生成其元素. [...]

Properties

first → E
返回第一个元素. [...]
只读
hashCode int
此对象的哈希码. [...]
只读,继承
isEmpty bool
如果此集合中没有元素,则返回true . [...]
只读
isNotEmpty bool
如果此集合中至少有一个元素,则返回true. [...]
只读
iterator Iterator<E>
返回一个新的Iterator ,它允许迭代此Iterable的元素. [...]
只读
last → E
返回最后一个元素. [...]
只读
length int
返回this中的元素数. [...]
只读
runtimeType Type
对象的运行时类型的表示形式.
只读,继承
single → E
检查此可迭代对象是否只有一个元素,然后返回该元素. [...]
只读

Methods

any(bool test(E element)) bool
Checks whether any element of this iterable satisfies test. [...]
cast<R>() Iterable<R>
作为R实例的可迭代对象,提供此可迭代对象的视图. [...]
contains(Object element) bool
如果集合包含等于element的元素,则返回true. [...]
elementAt(int index) → E
返回index个元素. [...]
every(bool test(E element)) bool
检查此可迭代的每个元素是否满足test . [...]
expand<T>(Iterable<T> f(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>
返回此iterable和other的惰性组合. [...]
forEach(void f(E element)) → void
按迭代顺序将函数f应用于此集合的每个元素.
join([String separator = ""]) String
将每个元素转换为字符串并连接字符串. [...]
lastWhere(bool test(E element), {E orElse()}) → E
返回满足给定谓词test的最后一个元素. [...]
map<T>(T f(E e)) Iterable<T>
返回带有元素的新的惰性Iterable ,该元素是通过按迭代顺序在此Iterable每个元素上调用f创建的. [...]
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>
返回提供除第一个count元素以外的所有元素的Iterable . [...]
skipWhile(bool test(E value)) Iterable<E>
返回一个Iterable ,它在满足test跳过前导元素. [...]
take(int count) Iterable<E>
返回此可迭代对象的count前一个元素的惰性可迭代对象. [...]
takeWhile(bool test(E value)) Iterable<E>
返回满足test的前导元素的惰性迭代. [...]
toList({bool growable: true}) List<E>
创建一个包含此Iterable元素的列表 . [...]
toSet() Set<E>
创建一个Set ,该Set包含与此Iterable相同的元素. [...]
toString() String
返回this的(某些)元素的字符串表示形式. [...]
覆写
where(bool test(E element)) Iterable<E>
返回一个新的lazy Iterable,它具有所有满足谓词test元素. [...]
whereType<T>() Iterable<T>
返回具有类型T所有元素的新的lazy Iterable . [...]

Operators

operator ==(Object other) bool
等于运算符. [...]
遗传

Static Methods

castFrom<S, T>(Iterable<S> source) Iterable<T>
sourceIterable<T> . [...]