示例SQL结果
dataResult
Code Amt TotalAmtPerCode
A1 4 0
A1 4 0
B1 4 0
B1 5 0
A1 6 0
有这个结果 我想问一下如何计算TotalAmtPerCode 预期结果应该是
Code Amt TotalAmtPerCode
A1 4 14
A1 4 14
B1 4 9
B1 5 9
A1 6 14
示例代码
for (Map<String, Object> data: dataResult) {
Long total = ComputeTotalAmount(dataResult,data.get(DBColumn.Code.name();
container.setTotalAmtPerCode(total);
}
计算总量的函数
private static long ComputeTotalAmount(List<Map<String, Object>> list, String code) {
Long total = 0;
for (Map<String, Object> data: dataResult) {
if (code.equals(data.get(DBColumn.Code.name()))) {
total = total+Long.valueOf(data.get(DBColumn.Code.name()).toString)
}
}
}
此代码运行正常,但我想对此代码进行优化。因为如果我要循环10,000条记录,它将检查代码的第一条记录,然后重复10k查找相同的代码,并获取该代码的金额并将其总和全部累加,然后它将检查第二条记录,依此类推。>
答案 0 :(得分:0)
您可以使用Collectors.groupingBy():
Map<String, Long> collect = list.stream()
.collect(Collectors.groupingBy(
p -> p.getFirst(),
Collectors.summingLong(p -> p.getSecond())
)
);
这将通过一些分类器对输入进行分组(这里是p -> p.getFirst()
,在您的情况下,可能类似于data.get(DBColumn.Code.name())
)并汇总值(p -> p.getSecond()
,必须将其更改为像Long.valueOf(data.get(DBColumn.Code.name()).toString)
)。
注意:getFirst()
和getSecond()
是org.springframework.data.util.Pair
中的方法。
示例:
List<Pair<String, Long>> list = new ArrayList<>();
list.add(Pair.of("A1", 1L));
list.add(Pair.of("A1", 2L));
list.add(Pair.of("B1", 1L));
Map<String, Long> collect = list.stream()
.collect(Collectors.groupingBy(
p -> p.getFirst(),
Collectors.summingLong(p -> p.getSecond())
)
);
System.out.println(collect);
输出:
{A1=3, B1=1}
答案 1 :(得分:0)
欢迎使用StackOverflow:)
据我所知,您需要将TotalAmtPerCode
值的总和与Code
进行分组。有一种方法Stream::collect
使用Collectors::groupingBy
收集器将值转换为所需的输出,该收集器将Stream<T>
分组为Map<K, V>
,其中V
是一个收集器。>
Map<String, Integer> map = dataresult.stream()
.collect(Collectors.groupingBy( // Group to Map
d -> d.get(DBColumn.Code.name()), // Key is the code
Collectors.summingInt(d -> d.get(DBColumn.TotalAmtPerCode.name())))); // Value is the sum
注意:
您可能需要根据需要编辑d -> d.get(DBColumn.Code.name())
和d.get(DBColumn.TotalAmtPerCode.name())
,以获取Code
和TotalAmtPerCode
-我不知道数据模型。
我假设TotalAmtPerCode
是int
。否则,请使用Collectors.summingLong
。