Java8 中根据对象属性去重和集合之间转换

本文介绍如何使用Java Stream API对List集合进行去重、转换为Map和Set的操作,并演示了如何过滤掉一个列表中与另一个列表相同的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、List 对象集合根据某个属性去重

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        // 根据 Product 类中的一个属性去重
        List<User> users = list.stream().filter(distinctByKey(User::getName)).collect(Collectors.toList());
        users.forEach(System.out::println);
    }
    /**
     * 根据对象的某个属性去重
     */
    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

二、List 对象集合根据多个属性去重

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        // 根据 User 中多个属性去重
        List<User> products = list.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toCollection(
                                () -> new TreeSet<>(Comparator.comparing(
                                        tc -> tc.getName() + ";" + tc.getClass()))), ArrayList::new)); // 需要设置多个去重的字段信息
        products.forEach(System.out::println);
    }

三、List 转换为 Map 集合

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        //1. 根据 User 中的 name 封装 Map 集合 key为 name , value 为 List<User>
        Map<String, List<User>> map1 = list.stream().collect(Collectors.groupingBy(User::getName));
        for (String key : map1.keySet()) {
            System.out.println(key);
            List<User> products1 = map1.get(key);
            products1.forEach(System.out::println);
        }

        //2. 根据 User 中的 id 封装 Map 集合 key为id  value为 User
        Map<Integer, User> map2 = list.stream().collect(Collectors.toMap(User::getId, Function.identity()));
        for (Integer key : map2.keySet()) {
            System.out.println("key = " + key + ", value = " + map2.get(key));
        }
    }

四、List 转换为 Set 集合

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        // 1.根据 User 中名称去重
        Set<String> users = list.stream().map(User::getName).collect(Collectors.toSet());
        for (String name : users) {
            System.out.println(name);
        }

        // List 中对象某个属性去重后,按照字符 - 拼接
        // 2根据 User 中名称,使用 - 连接符连接
        String users2 = list.stream().map(User::getName).distinct().collect(Collectors.joining("-"));
        System.out.println(users2);
    }

五、过滤掉list1中与list2相

public static void main(String[] args) {

        List<Map<String,Object>> list1 = new ArrayList<Map<String,Object>>();
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name", "111");
        map1.put("age", "21");

        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name", "222");
        map2.put("age", "22");

        Map<String,Object> map3 = new HashMap<String,Object>();
        map3.put("name", "333");
        map3.put("age", "23");


        Map<String,Object> map4 = new HashMap<String,Object>();
        map4.put("name", "444");
        map4.put("age", "24");

        list1.add(map1);
        list1.add(map2);
        list1.add(map3);
        list1.add(map4);
        List<Map<String,Object>> list2 = new ArrayList<Map<String,Object>>();

        Map<String,Object> map11 = new HashMap<String,Object>();
        map11.put("name", "111");
        map11.put("age", "21");

        Map<String,Object> map22 = new HashMap<String,Object>();
        map22.put("name", "222");
        map22.put("age", "22");

        list2.add(map11);
        list2.add(map22);


        //过滤两个list中相同的属性值的数据
        List<Map<String,Object>> list3 = list1.stream().parallel().filter(a -> list2.stream()
                .noneMatch(b-> Objects.equals(a.get("age"), b.get("age")))).collect(Collectors.toList());

        System.out.println(list3);
    }

同的元素,并组成新的集合

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值