Java stream流实现List<对象>或 List<Map>通过对象中的单个字段或多个字段去重, 亦或者对整个对象(Map)进行去重

// 创建 集合对象
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值