可以按顺序访问值的集合或“元素”。
可迭代类的元素通过获取一个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]}');
}
List和Set类都是Iterable
,大多数在dart:collection
库中的类也是如此。
一些Iterable集合是可以修改的。向List
或Set
添加元素将更改它包含的元素,向Map
添加新密钥将更改Map.keys的元素。在修改之后创建的迭代器将提供新的元素,并且可能或可能不保留现有元素的顺序(例如,向HashSet添加单个元素时,其顺序可能会完全改变)。
在迭代集合时更改集合通常是不允许的。这样做会中断迭代,这通常是在下一次调用Iterator.moveNext时通过抛出ConcurrentModificationError来表示的。Iterator.current获取器的当前值不应受集合更改的影响,而是Iterator.current值由之前的调用Iterator.moveNext设置为。
某些可迭代对象在每次迭代时都会动态计算它们的元素,就像由Iterable.generate返回的或由sync*
生成器函数返回的迭代器一样。如果计算不依赖于可能更改的其他对象,则生成的序列在每次迭代时应该是相同的。
除了自身的迭代器 iterator
之外,Iterable
的成员通过查看可迭代对象的元素来工作。这可以通过运行迭代器 iterator 来实现,但某些类可能有更高效的查找结果的方法(例如在 List 上的 last 或 length,或在 Set 上的 contains )。
返回另一个 Iterable
(如 map 和 where)的方法都是 惰性的 - 它们将在每次迭代返回的可迭代对象时迭代原始的(如必要),而不是在此之前。
由于可迭代对象可能被迭代多次,因此不建议在迭代器中有可检测的副作用。对于 map 和 where 这样的方法,返回的可迭代对象将在每次迭代上执行参数函数,因此这些函数也不应该有副作用。
Iterable
声明提供了一个默认实现,可以扩展或混合进来实现 Iterable
接口。它实现了除了 iterator 属性获取器以外的每个成员,使用由 iterator 提供的 Iterator。当可以做到时,应该为 Iterable
接口提供成员的更有效率的实现。
构造函数
- Iterable()
-
const
- Iterable.empty()
- 创建一个空的可迭代对象。constfactory
- 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< ) → Iterable<T> toElements(E element)T> - 将此 Iterable 的每个元素展开为零个或多个元素。
-
firstWhere(
bool test(E element), {E orElse()?}) → E - 满足给定谓词
test
的第一个元素。 -
fold<
T> (T initialValue, T combine(T previousValue, E element)) → T - 通过迭代将集合的每个元素与现有值组合来将集合缩减为单个值。
-
followedBy(
Iterable< ) → Iterable<E> otherE> - 创建此可迭代和
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 的字符串。