7.6.2 Collect操作

如前所述,选择和拒绝操作总是生成一个原有集合的的子集合。当我们想从其它集合得到一个衍生集合,并且希望衍生集合与原有集合的元素不同(即不是子集合)时,我们可以使用collect操作。collect操作语法如下:

collection->collect(v: Type|expression-with-v)
collection->collect(v|expression-with-v)
collection->collect(expression)

collect操作的值是所有expression-with-v计算结果的集合。

举个例子:指定某个公司上下文下所有员工birthDates的集合。这可以使用如下任一表示来完成:

self.employee->collect(birthDate)
self.employee->collect(person|person.birthDate)
self.employee->collect(person: Person|person.birthDate)

这里一个重要的问题(issue)是原集合是一个Set而结果集合是一个Bag。此外,如果原集合是一个Sequence或一个OrderedSet,结果集合是一个Sequence。当多个员工具有相同的birthDate时,该值将成为结果Bag中的一个元素。collect操作的结果Bag与原有集合具有相同的元素个数。

通过使用Bag上的asSet属性(操作),可以从Bag得到一个Set。如下表达式生成一个公司的所有员工的birthDate Set。

self.employee->collect(birthDate)->asSet()

用于Collect的Shorthand

由于在多个对象上的导航很普遍,collect有一个简化表示可以使得OCL表达式更易读。我们可以用:

self.employee.birthDate

来代替

self.employee->collect(birthDate)

通常,当我们在一个对象集合上应用某个属性时,它将自动地被解释为在该集合元素上进行指定属性的collect

对于集合中对象上定义的任意属性propertyname,如下的两个表达式是等同的:

collection.propertyname
collection->collect(propertyname)

而且如下也是一样:

collection.propertyname(par1, par2, ...)
collection->collect(propertyname(par1, par2, ...))

results matching ""

    No results matching ""