Java 使用StreamAPI查找多个字段的总和、平均分组数

Java 使用StreamAPI查找多个字段的总和、平均分组数,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有课 public class CenterReportDto { ZonedDateTime date; int centerId; int amount; float percent; } 和项目清单 List<CenterReportDto> entityList = new ArrayList<>(); 得到 JANUARY-7 FEBRUARY-9 JANUARY-3.5 FEBRUARY-4.5 如何组合两种方

我有课

public class CenterReportDto {
     ZonedDateTime date;
     int centerId;
     int amount;
     float percent;
}
和项目清单

List<CenterReportDto> entityList = new ArrayList<>();
得到

JANUARY-7
FEBRUARY-9

JANUARY-3.5
FEBRUARY-4.5
如何组合两种方法,并按月份和centerId分组,以获得金额总和字段和百分比平均值字段,如:

JANUARY - 123 - 7 -  3.5
FEBRUARY -123 - 9 - 4.5
JANUARY - 456 - 7 -  3.5
FEBRUARY -456 - 9 - 4.5

它只计算总和,因为您使用了Collector.SummingIT。您可以通过Collectors.SummaringInt获得IntSummaryStatistics,然后自己计算平均值。哦,不,有一个方便的工具。

它只计算总和,因为您使用收集器。summingit。您可以通过Collectors.SummaringInt获得IntSummaryStatistics,然后自己计算平均值。哦,不,有一个方便的工具。

它起作用了:

   entityList.stream()
          .collect(Collectors.groupingBy(i -> i.getDate().getMonth(),
                                         Collectors.groupingBy(i -> i.getCenterId(),
                                         Collectors.collectingAndThen(Collectors.toList(),
                                                                      l -> {Integer sum = l.stream().collect(Collectors.summingInt(i -> i.getAmount()));
                                                                            Double avg = l.stream().collect(Collectors.averagingDouble(i -> i.getPercent()));
                                                                            return new AbstractMap.SimpleEntry<>(sum, avg);
                                                                            }))))
          .forEach((k, v) -> v.forEach((k1, v1) -> System.out.println(k.toString() + " - " + k1.toString() + " - " + v1.getKey() + " - " + v1.getValue())));
它奏效了:

   entityList.stream()
          .collect(Collectors.groupingBy(i -> i.getDate().getMonth(),
                                         Collectors.groupingBy(i -> i.getCenterId(),
                                         Collectors.collectingAndThen(Collectors.toList(),
                                                                      l -> {Integer sum = l.stream().collect(Collectors.summingInt(i -> i.getAmount()));
                                                                            Double avg = l.stream().collect(Collectors.averagingDouble(i -> i.getPercent()));
                                                                            return new AbstractMap.SimpleEntry<>(sum, avg);
                                                                            }))))
          .forEach((k, v) -> v.forEach((k1, v1) -> System.out.println(k.toString() + " - " + k1.toString() + " - " + v1.getKey() + " - " + v1.getValue())));

你试过什么吗?它有效吗?用于获取一个对象进行分组。-至于如何分组和求和,您可以通过简单的web搜索找到无数个示例。参见,您尝试过什么吗?它有效吗?用于获取要分组的对象。-至于如何分组和求和,您可以通过简单的web搜索找到大量示例。另请参见@harp1814 Collector。averagingDoubleCenterReportDto::getAmount会丢失CenterReportDto实例,因为它只需要从这些实例获取Amount。要获得像2月123日-9日-4.5日这样的输出,缩减的结果应该是CenterReportDto,而不是普通的number@harp1814Collectors.averagingDoubleCenterReportDto::getAmount会丢失CenterReportDto实例,因为它只需要从这些实例获取数量。要获得像二月-123-9-4.5这样的输出,减少的结果应该是CenterReportDto,而不是一个普通的数字