7.6.6 Iterate操作
iterate 操作更为复杂一些,但也更为一般化。reject, select, forAll, exists, collect都可以用iterate来描述。它通过遍历一个集合来构造每个值。
collection->iterate(elem: Type; acc: Type=<expression> | expression-with-elem-and-acc)
变量elem是迭代器,如同在select, forAll等中的定义一样。变量acc是聚集器(accumulator)。聚集器从<expression>获得初始值。当迭代执行时,elem对collection进行遍历,expression-with-elem-and-acc在每个elem上进行计算。每一次expression-with-elem-and-acc计算的值都赋给acc。通过这种方式,acc的值在迭代过程中被构建。用iterate描述的collect操作如下:
collection->collect(x: T| x.property) --等同于
collection->iterate(x: T; acc : T2=Bag{} | acc->including(x.property))
上述迭代结果以类Java的伪代码可以表示为:
iterate(elem: T; acc: T2=value)
{
acc=value;
for (Enumeration e=collection.elements(); e.hasMoreElements();){
elem=e.nextElement();
acc.add(<expression-with-elem-and-acc>);
}
return acc;
}
尽管Java伪代码使用了“下一个元素”,但iterate操作不只适用于Sequence,而是所有的集合类型。Set和Bag中元素的遍历次序未定义。对于Sequence,其次序就是元素在该序列中的次序。