动态获取map集合的每一项之和,算出合计的map加入集合,兼容字符串"-"、double类型和int类型
/** * 动态获取map集合的每一项之和,算出合计的map加入集合,兼容字符串"-"、double类型和int类型 * @param mapList */ private void getDynamicItemSum(List<Map<String,Object>> mapList){ // 创建总和Map Map<String, Object> mapTotal = new HashMap<>(); mapTotal.put("NAME", "合计"); // 自动获取第一个map的字段作为求和字段(排除"NAME") Map<String, Object> map1 = mapList.get(0); List<String> sumFields = new ArrayList<>(map1.keySet()); sumFields.remove("NAME"); // 初始化求和变量和类型标记 Map<String, Double> sums = new HashMap<>(); Map<String, Boolean> isDoubleType = new HashMap<>(); Map<String, Boolean> hasString = new HashMap<>(); // 新增:标记字段是否包含字符串 for (String field : sumFields) { sums.put(field, 0.0); isDoubleType.put(field, false); hasString.put(field, false); // 初始化为false } // 遍历mapList进行动态类型判断和求和 for (Map<String, Object> map : mapList) { for (String field : sumFields) { Object value = map.get(field); if (value instanceof String) { hasString.put(field, true); // 标记该字段包含字符串 } else if (value instanceof Number) { // 仅当没有字符串时才累加 if (!hasString.get(field)) { if (value instanceof Double) { isDoubleType.put(field, true); sums.put(field, sums.get(field) + ((Double) value)); } else { sums.put(field, sums.get(field) + ((Number) value).doubleValue()); } } } } } // 将求和结果放入mapTotal(智能格式化) for (String field : sumFields) { if (hasString.get(field)) { mapTotal.put(field, "-"); // 存在字符串则显示"-" } else { if (isDoubleType.get(field)) { // Double类型保留两位小数 double total = NumberUtil.round(sums.get(field), 2).doubleValue(); mapTotal.put(field, total); } else { // Int类型直接取整 long total = Math.round(sums.get(field)); mapTotal.put(field, total); } } } // 按照map1的顺序重新排列mapTotal Map<String, Object> sortedMap = mapTotal.entrySet().stream() .sorted(Comparator.comparingInt(e -> new ArrayList<>(map1.keySet()).indexOf(e.getKey()))) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> oldVal, LinkedHashMap::new )); // 将mapTotal插入到mapList的最前面 mapList.add(0, sortedMap); }
吾乃代码搬运工,侵联删
浙公网安备 33010602011771号