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,而不是一个普通的数字