This示例代码给出了获取给定公司薪水总和的示例
int avgSalary = employees.aggregate(
Supplier.fromPredicate(
(entry) -> "Hazelcast".equals(mapEntry.getValue().getCompanyName(),
Supplier.all((value) -> value.getSalaryPerMonth())
), Aggregations.integerAvg());
是否可以根据属性集获取聚合? 即,我可以按公司分组,而不是在公司上应用过滤器吗?如果不是聚合器,SQL谓词是否支持这个?
编辑: 我能够编写自定义聚合器
class DayLocalSumGroupByBookAggregator extends Aggregator<Map.Entry<Long, Pnl>, Map<Integer, Double>> {
private static final long serialVersionUID = 1L;
Map<Integer, Double> bookToSumOfDayLocal ;
@Override
public void accumulate(Entry<Long, Pnl> input) {
Integer bookId = input.getValue().getBookId();
if(bookToSumOfDayLocal == null ){
bookToSumOfDayLocal = new HashMap<>();
}
Double sum = bookToSumOfDayLocal.get(bookId);
if(sum == null){
sum = 0d;
}
sum += input.getValue().getDayLocal();
bookToSumOfDayLocal.put(bookId, sum);
}
@Override
public void combine(Aggregator aggregator) {
//TODO
}
@Override
public Map<Integer, Double> aggregate() {
return bookToSumOfDayLocal;
}
}
但是当我需要多个聚合(多个属性的总和)和多个字段分组时,它确实变得复杂。这将在更多版本中得到支持吗?
答案 0 :(得分:0)
将在更多版本中支持Group by。现在你需要坚持自定义实现。积累由属性分组的多个属性的总和并不难。只需要一张价值图等等。