// 创建 集合对象
List<User> userList = new ArrayList<>();
userList.add(new User(1L, "张三", "1001", "99999999", 21));
userList.add(new User(1L, "张三", "1001", "99999999", 21)); // 重复
userList.add(new User(3L, "张三", "1001", "99999999", 22));
userList.add(new User(4L, "张三", "1001", "99999999", 21));
userList.add(new User(5L, "张四", "1002", "88888888", 21));
// 1. 普通写法(比较对象是否重复)
List<User> list = userList.stream()
.distinct() // 使用默认的equals方法进行去重
.collect(Collectors.toList());
结果输出:
[User(id=1, name=张三, code=1001, phone=99999999, age=21),
User(id=3, name=张三, code=1001, phone=99999999, age=22),
User(id=4, name=张三, code=1001, phone=99999999, age=21),
User(id=5, name=张四, code=1002, phone=88888888, age=21)]
// 2. 单个根据字段进行去重
List<User> list = userList.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>
(Comparator.comparing(User::getName))),ArrayList::new));
结果输出:
[User(id=1, name=张三, code=1001, phone=99999999, age=21),
User(id=3, name=张三, code=1001, phone=99999999, age=22),
User(id=4, name=张三, code=1001, phone=99999999, age=21),
User(id=5, name=张三, code=1001, phone=99999999, age=21)]
// 3. 根据多个字段 进行去重 name、code、phone
List<User> list = userList.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>
(Comparator.comparing(User::getName)
.thenComparing(User::getCode)
.thenComparing(User::getPhone))),
ArrayList::new));
结果输出:
[User(id=1, name=张三, code=1001, phone=99999999, age=21),
User(id=5, name=张四, code=1002, phone=88888888, age=21)]
以上是使用Collectors.collectingAndThen收集器将流中的元素收集到一个TreeSet中。这个TreeSet会根据User对象的name、code和phone字段进行排序和去重。最后,再使用ArrayList::new将排序后的TreeSet中的元素收集到一个新的ArrayList中。
// 4.0 直接对整个Map(对象)的Value值进行去重
List<Map<String,Object>> list1 = new ArrayList<>();
Map<String,Object> map = new HashMap();
Map<String,Object> map2 = new HashMap();
map.put("key","1");
map.put("value","a");
map2.put("key","2");
map2.put("value","a");
list1.add(map);
list1.add(map2);
list1.forEach(System.out::println);
List<Map<String, Object>> list2 = list1.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() ->new TreeSet<>(Comparator.
comparing(m->m.get("value").toString()))),ArrayList::new));
/*
5.0 利用函数式编程,手动编写去重方法
*/
import java.util.*;
import java.util.stream.Collectors;
public class UniqueMapList {
public static void main(String[] args) {
// 创建示例数据
List<Map<String, Object>> minuteWetherList = new ArrayList<>();
// 添加示例数据
minuteWetherList.add(createWeatherMap("2023-10-01", "Sunny", 25));
minuteWetherList.add(createWeatherMap("2023-10-01", "Rainy", 20));
minuteWetherList.add(createWeatherMap("2023-10-01", "Sunny", 25)); // 重复
minuteWetherList.add(createWeatherMap("2023-10-02", "Cloudy", 22));
minuteWetherList.add(createWeatherMap("2023-10-01", "Sunny", 25)); // 重复
// 根据多个字段去重
List<Map<String, Object>> uniqueWeatherList = minuteWetherList.stream()
.filter(distinctByKeys("date", "condition", "temperature"))
.collect(Collectors.toList());
// 输出结果
System.out.println(uniqueWeatherList);
}
// 创建示例天气数据
private static Map<String, Object> createWeatherMap(String date, String condition, int temperature) {
Map<String, Object> weatherMap = new HashMap<>();
weatherMap.put("date", date);
weatherMap.put("condition", condition);
weatherMap.put("temperature", temperature);
return weatherMap;
}
// 根据多个字段去重的过滤器
private static <T> Predicate<T> distinctByKeys(String... keys) {
Set<String> seen = new HashSet<>();
return t -> {
String key = Arrays.stream(keys)
.map(k -> ((Map<String, Object>) t).get(k).toString())
.collect(Collectors.joining("|")); // 使用 | 作为分隔符
return seen.add(key);
};
}
}
原文链接:https://blog.youkuaiyun.com/weixin_47390965/article/details/134870659