要按对象分组映射的对象列表 属性

List of object to map group by object property

我有一个 Object 列表,其中有一些与 GL Head 一起。 我想通过 GL-Head 对这些金额的组总和进行 Map

            List<Fees> feesList = new ArrayList<>();
            Fees f = new Fees();
            f.setGlHead(10);
            f.setImposed(25.0);
            feesList.add(f);

            f = new Fees();
            f.setGlHead(11);
            f.setImposed(30.0);
            feesList.add(f);

            f = new Fees();
            f.setGlHead(10);
            f.setImposed(15.0);
            feesList.add(f);

            Map<Integer, Double> map = ..... // how by lambda ?

在哪里, 关键整数是 GL Head,Value Double 是 GL Head 强加金额的组总和,结果类似于具有值 >> (10, 40.0) & (11, 30)

的映射

流来救援!此任务本质上是 Collectors documentation 中的示例之一,只是使用双精度而不是整数。

var map = feesList.stream()
           .collect(Collectors.groupingBy(Fees::getGlHead,
                                          Collectors.summingDouble(Fees::getImposed));

(实际方法名根据需要调整)


如果你不想使用流,你可以通过循环获得相同的效果:

var map = new HashMap<Integer, Double>(); // Or whatever type of map
for (Fees fee : feeList) {
    map.merge(fee.getG1Head(), fee.getImposed(), Double::sum);
}

如果映射中不存在给定键,Map::merge 函数将使用给定值添加它。如果该键已经存在,则将新值和现有值传递给作为第三个参数的函数,并使用其结果更新地图。