一开始是使用java8的toMap,会导致数据被覆盖,有重复的数据会覆盖前面的数据
Map<String, HashMap<String, Object>> thisMap = thisData.stream().collect(Collectors.toMap(data -> data.get("real_name").toString(), Function.identity()));
改为下面的写法,利用toMap的第三个参数处理数据
List<HashMap<String, Object>> thisData = thisResultData.getData();
// 重复key导致的数据覆盖问题:使用toMap的第三个参数处理重复key的情况,比较并保留排名靠前的记录
Map<String, HashMap<String, Object>> thisMap = thisData.stream().collect(
Collectors.toMap(
data -> data.get("real_name").toString(),
Function.identity(),
(existing, replacement) -> {
// 比较rank,保留排名靠前的记录
Integer existingRank = (Integer) existing.get("rank");
Integer replacementRank = (Integer) replacement.get("rank");
return (existingRank != null && replacementRank != null && existingRank < replacementRank) ?
existing : replacement;
}
)
);
1. 通过stream()将列表转为流
2. 使用Collectors.toMap()收集器将流转换为Map
3. 第一个参数是键映射函数,从每个HashMap中提取"real_name"作为Map的键
4. 第二个参数Function.identity()表示值就是原始的HashMap对象
5. 第三个参数是一个合并函数,处理键冲突的情况:当出现相同real_name时,比较两个记录的user_rank值,保留排名靠前的记录(rank值较小的)
这种处理方式解决了数据中可能存在的重复键问题,确保最终Map中每个real_name只对应一个排名最高的记录。
6107

被折叠的 条评论
为什么被折叠?



