gpt4 book ai didi

Java 8 lambda 求和、计数和分组依据

转载 作者:搜寻专家 更新时间:2023-11-01 01:12:07 29 4
gpt4 key购买 nike

Select sum(paidAmount), count(paidAmount), classificationName,
From tableA
Group by classificationName;

我如何在 Java 8 中使用流和收集器来做到这一点?

Java8:

lineItemList.stream()
.collect(Collectors.groupingBy(Bucket::getBucketName,
Collectors.reducing(BigDecimal.ZERO,
Bucket::getPaidAmount,
BigDecimal::add)))

这给了我求和和分组依据。但是我怎样才能得到组名呢?

期望是:

100, 2, classname1 
50, 1, classname2
150, 3, classname3

最佳答案

使用 this answerStatistics 类的扩展版本,

class Statistics {
int count;
BigDecimal sum;

Statistics(Bucket bucket) {
count = 1;
sum = bucket.getPaidAmount();
}
Statistics() {
count = 0;
sum = BigDecimal.ZERO;
}

void add(Bucket b) {
count++;
sum = sum.add(b.getPaidAmount());
}

Statistics merge(Statistics another) {
count += another.count;
sum = sum.add(another.sum);
return this;
}
}

你可以在像这样的流操作中使用它

Map<String, Statistics> map = lineItemList.stream()
.collect(Collectors.groupingBy(Bucket::getBucketName,
Collector.of(Statistics::new, Statistics::add, Statistics::merge)));

这可能有一个小的性能优势,因为它只为每个组创建一个 Statistics 实例以进行顺序评估。它甚至支持并行评估,但您需要一个非常大的列表和足够大的组才能从并行评估中获益。

对于顺序求值,操作等同于

lineItemList.forEach(b ->
map.computeIfAbsent(b.getBucketName(), x -> new Statistics()).add(b));

而在并行评估后合并部分结果更接近链接答案中已经给出的示例,即

secondMap.forEach((key, value) -> firstMap.merge(key, value, Statistics::merge));

关于Java 8 lambda 求和、计数和分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389960/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com