使用Lambda串流哈希地图

时间:2018-08-30 12:14:34

标签: java lambda

示例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查找相同的代码,并获取该代码的金额并将其总和全部累加,然后它将检查第二条记录,依此类推。

2 个答案:

答案 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()),以获取CodeTotalAmtPerCode-我不知道数据模型。

  • 我假设TotalAmtPerCodeint。否则,请使用Collectors.summingLong