CompoundAggregate implements the "compound aggregate": i.e. the combination of several aggregates. (Note that this can calculate more than one aggregate on one traversal).
public static class CompoundAggregate implements Aggregate { public void initialize(Object val) { for (Aggregate agg : aggregates) { agg.initialize(val); } } public void accumulate(Object val) { for (Aggregate agg : aggregates) { agg.accumulate(val); } } public Object result() { Object[] arr = new Object[aggregates.length]; for (int i = 0; i < aggregates.length; i++) { arr[i] = aggregates[i].result(); } return arr; } public void merge(Aggregate other) { Aggregate[] otherAggregates = ((CompoundAggregate)other).aggregates; for (int i = 0; i < otherAggregates.length; i++) { aggregates[i].merge(otherAggregates[i]); } } public CompoundAggregate(Aggregate... aggs) { aggregates = aggs; } Aggregate[] aggregates; }