list对象去重:
Map<String, Person> peopleByName = people.stream()
.collect(Collectors.toMap(Person::getName, p -> p, (p1, p2) -> p1));
list<Map>去重:根据 Map 中特定字段去重(保留第一个出现的元素)
list.stream()
.filter(map -> map.containsKey("去重的字段"))
.collect(Collectors.collectingAndThen(
Collectors.toMap(
map -> map.get("去重的字段"),
map -> map,
(existing, replacement) -> existing // 保留首次出现的元素
),
map -> new ArrayList<>(map.values()))
);
list<Map>去重:根据多个字段组合去重(保留最后一个出现的元素)
public static List<Map<String, Object>> test(
List<Map<String, Object>> list,
List<String> compositeKeys) {
return list.stream()
.filter(map -> compositeKeys.stream().allMatch(map::containsKey))
.collect(Collectors.collectingAndThen(
Collectors.toMap(
map -> compositeKeys.stream()
.map(key -> Objects.toString(map.get(key), ""))
.collect(Collectors.joining("|")),
map -> map,
(oldVal, newVal) -> newVal // 保留最后出现的元素
),
map -> new ArrayList<>(map.values()))
);
}
// 测试:根据name+city组合去重(保留最后一个)
List<Map<String, Object>> result2 = test(dataList, Arrays.asList("name", "city"));
System.out.println("复合键去重结果:" + result2);
list<Map>去重:基于 TreeSet 的自定义去重(保持顺序)
public static List<Map<String, Object>> test(
List<Map<String, Object>> list,
String uniqueKey) {
Set<Object> seen = new LinkedHashSet<>();
return list.stream()
.filter(map ->
map.containsKey(uniqueKey) &&
seen.add(map.get(uniqueKey))
)
.collect(Collectors.toList());
}
// 测试3:保持顺序的去重
List<Map<String, Object>> result3 = test(dataList, "id");
System.out.println("保序去重结果:" + result3);