使用java的Stream流进行Collectors.groupingBy分组后生成Map,对Map进行删除原集合是否会发生改变

在Java中,当我们使用Collectors.groupingBy方法对集合进行分组操作时,生成的新映射(Map)是基于原始集合(allItems)的数据结构和内容创建的。这意味着,如果你更改了新的映射allItemMap中的值(例如,修改了List的内容),这不会直接影响到原始集合allItems

但是,如果FinFreightItemR对象本身是可变对象,并且你在映射中的列表中直接修改了这些对象的属性,那么虽然allItems集合本身没有变化(集合内的引用没有改变),但通过这个引用指向的对象内容已经被修改,所以看起来就像是原始集合也发生了变化。

总的来说,对于原始集合allItems,其元素的引用不会因为映射allItemMap的更改而改变,但如果修改了这些引用所指向的对象内容,则会看到原始集合中相应对象内容的变化。

还有·就是在这个Java 8的流式处理操作中,.collect(Collectors.groupingBy(User::getProfitmonth))会创建一个新的Map实例collectMap,该映射基于原始集合userList中的元素进行分组。虽然新的映射中的列表(List)包含的是引用到原始userList中User对象的地址,但映射本身以及在映射内部创建的新列表结构都是独立于原userList的新对象。

所以:

  1. collectMap这个新映射是分配在不同的内存地址上的。
  2. 映射中的每个键值对(Key-Value)所对应的List<User>是新的列表实例,它们包含了指向userList中原有User对象的引用。
  3. 如果你修改了collectMap中的User对象属性,由于引用共享,这些更改也会反映在原始userList中对应的User对象上。
  4. 但是,如果你添加或删除collectMap中的元素,这不会影响到原始userList的大小和内容。
    以下是一段实例代码:
 List<User> userList=new ArrayList<>();
        User user=new User();
        user.setName("wxl");
        user.setAmount(new BigDecimal("28000"));
        user.setProfitmonth("2024-04");
        user.setUploadFileName("12-1 HAI SU 7.pdf");
        User user1=new User();
        user1.setName("wxl");
        user1.setAmount(new BigDecimal("28000"));
        user1.setProfitmonth("2024-05");
        user1.setUploadFileName("12-1 HAI SU 7.pdf");
        User user2=new User();
        user2.setName("wxl");
        user2.setAmount(new BigDecimal("32000"));
        user2.setProfitmonth("2024-06");
        user2.setUploadFileName("12-1 HAI SU 7.pdf");
        userList.add(user);
        userList.add(user1);
        userList.add(user2);
        System.out.println(userList);
        Map<String, List<User>> collectMap = userList.stream().collect(Collectors.groupingBy(User::getProfitmonth));
        System.out.println(collectMap);
        List<User> list = collectMap.get("2024-06");
        list.get(0).setUploadFileName("su7.pdf");
        collectMap.remove("2024-04");
        System.out.println(collectMap);
        System.out.println(userList);

我们可以看到运行结果是:
在这里插入图片描述
可以看到在Map中删除数据之后,原List集合中的数据是没有变删除的;但是如果对元素进行修改的话,那原来的List集合元素值也会变。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值