一、使用场景
在处理大量List<Map<String, Object>>
集合的数据时,为确保数据的唯一性,需要先根据Map
的某个唯一标识进行去重,然后将去重后的数据切分成较小的子列表进行分组处理。
二、实现步骤
- 去重:通过将列表中的数据转换为Map,利用Map的键唯一性,去除重复的元素。同时,通过保留第一个出现的元素,可以确保数据的顺序。
- 切分:将去重后的列表按照指定大小进行切分,方便进行批量处理或分布式处理。
三、相关知识
Java 8 Stream API:提供了一种函数式编程风格的处理集合数据的方式,可以进行过滤、映射、排序、聚合等操作,大大提高了代码的可读性和简洁性。
Collectors工具类:提供了各种收集器,用于对 Stream 中的元素进行收集和汇总操作,如
toMap
、toList
等。hutool 工具类:使用工具类中的
ListUtil.split(list, size)
方法,将列表切分为指定大小的子列表。
四、代码示例
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
list.add(Map.of("id", 1, "date", "2024-01-01"));
list.add(Map.of("id", 2, "date", "2024-01-02"));
list.add(Map.of("id", 3, "date", "2024-01-03"));
list.add(Map.of("id", 3, "date", "2024-01-04"));
list.add(Map.of("id", 4, "date", "2024-01-05"));
list.add(Map.of("id", 3, "date", "2024-01-06"));
list.add(Map.of("id", 5, "date", "2024-01-07"));
List<List<Map<String, Object>>> split = getLists(list);
System.out.println(split);
}
private static List<List<Map<String, Object>>> getLists(List<Map<String, Object>> list) {
// 去重
List<Map<String, Object>> resultList = new ArrayList<>(list.stream()
.collect(Collectors.toMap(
map -> map.get("id"), // key 为 id
map -> map, // value 为整个 Map
(existing, replacement) -> existing, // 如果有重复的 id,保留第一个出现的
LinkedHashMap::new // 保持顺序
)).values());
// 切分为 100 条一组
return ListUtil.split(resultList, 100);
}