Java实现最早与最晚数据集合并并生成新JSON对象咨询
按ID合并最早/最晚数据集生成指定JSON结构
我有两个查询分别返回最早和最晚数据集的相同结构对象,示例数据集如下:
List<Map<String, Object>> earliestDataset = Arrays.asList( Map.of("id", 123, "highlights", 2, "created_date", "2024-01-01", "saves", 5, "wins", 3), Map.of("id", 124, "highlights", 3, "created_date", "2024-01-03", "saves", 2, "wins", 1), Map.of("id", 253, "highlights", 5, "created_date", "2024-02-02", "saves", 3, "wins", 7) ); List<Map<String, Object>> latestDataset = Arrays.asList( Map.of("id", 123, "highlights", 6, "created_date", "2024-04-01", "saves", 22, "wins", 14), Map.of("id", 124, "highlights", 9, "created_date", "2024-04-03", "saves", 8, "wins", 9), Map.of("id", 253, "highlights", 12, "created_date", "2024-03-02", "saves", 15, "wins", 20) );
希望将两个数据集按id合并,生成如下格式的新JSON对象(以ID=123为例):
{ "id": "123", "highlights": [ { "earliest": "2", "latest": "6", "difference": "+4" } ], "created_date": [ { "earliest": "2024-01-01", "latest": "2024-04-01" } ], "saves": [ { "earliest": "5", "latest": "22", "difference": "+17" } ], "wins": [ { "earliest": "3", "latest": "14", "difference": "+11" } ] }
不确定应使用Map还是Stream来匹配id并映射值生成新JSON对象,恳请技术帮助。
解决方案:结合Map索引与Stream处理
1. 用Map构建最晚数据集的ID索引
先把latestDataset转换成以ID为键的Map,实现O(1)时间复杂度的快速查找,避免嵌套循环提升效率:
Map<Integer, Map<String, Object>> latestById = latestDataset.stream() .collect(Collectors.toMap( item -> (Integer) item.get("id"), item -> item ));
2. 遍历最早数据集,合并生成目标结构
通过Stream遍历最早数据集的每个对象,匹配对应ID的最新数据,按要求构建字段结构:
List<Map<String, Object>> mergedResult = earliestDataset.stream() .map(earliestItem -> { Integer id = (Integer) earliestItem.get("id"); Map<String, Object> latestItem = latestById.get(id); if (latestItem == null) { return null; // 无对应最新数据则跳过 } Map<String, Object> merged = new HashMap<>(); merged.put("id", String.valueOf(id)); // 处理需计算差值的字段:highlights、saves、wins List<String> diffFields = Arrays.asList("highlights", "saves", "wins"); diffFields.forEach(field -> { Integer earliestVal = (Integer) earliestItem.get(field); Integer latestVal = (Integer) latestItem.get(field); int diff = latestVal - earliestVal; Map<String, String> fieldMap = new HashMap<>(); fieldMap.put("earliest", String.valueOf(earliestVal)); fieldMap.put("latest", String.valueOf(latestVal)); fieldMap.put("difference", diff >= 0 ? "+" + diff : String.valueOf(diff)); merged.put(field, Collections.singletonList(fieldMap)); }); // 处理无需差值的字段:created_date Map<String, String> dateMap = new HashMap<>(); dateMap.put("earliest", (String) earliestItem.get("created_date")); dateMap.put("latest", (String) latestItem.get("created_date")); merged.put("created_date", Collections.singletonList(dateMap)); return merged; }) .filter(Objects::nonNull) // 过滤无对应最新数据的项 .collect(Collectors.toList());
3. 转换为JSON字符串(可选)
若需输出格式化的JSON,可使用Jackson库:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); String jsonOutput = objectMapper.writeValueAsString(mergedResult); System.out.println(jsonOutput);
方案说明
- Map的作用:构建ID到最新数据的索引,解决嵌套循环查找效率低的问题。
- Stream的作用:用函数式编程简化遍历、转换、过滤等操作,代码更简洁易维护。
- 这种结合方式同时兼顾了查找效率和代码可读性,是处理此类数据集合并需求的最优实践之一。
内容的提问来源于stack exchange,提问作者annaM
相关产品推荐
相关产品推荐

