使用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
    评论
Java 8中,使用StreamCollectors.groupingBy方法可以对数据进行分组操作。但是需要注意的是,如果分组的字段数据存在丢失的情况,可能是由于以下因导致的: 1. 分组字段的数据类型不一致:如果分组字段的数据类型不一致,可能导致分组时数据丢失。例如,如果分组字段是一个对象的属性,而该属性的数据类型在不同的对象中不一致,那么在分组时可能导致某些数据被丢弃。 2. 分组字段的hashCode和equals方法未正确重写:在进行分组操作时,需要使用分组字段的hashCode和equals方法来确定分组的依据。如果这两个方法未正确重写,可能导致分组时数据丢失。 为了避免数据丢失的情况发生,可以采取以下措施: 1. 确保分组字段的数据类型一致:在进行分组操作之前,可以先对分组字段的数据类型进行统一,保它们具有相同的数据类型。 2. 重写分组字段的hashCode和equals方法:如果分组字段是一个自定义对象的属性,需要确保该属性的hashCode和equals方法已正确重写,以确保分组操作的准确性。 下面是一个示例代码,演示了如何使用Java 8的StreamCollectors.groupingBy方法进行分组操作: ```java import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupingByDemo { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eva"); // 按照名字的首字母进行分组 Map<Character, List<String>> groups = names.stream() .collect(Collectors.groupingBy(name -> name.charAt(0))); // 输出分组结果 groups.forEach((key, value) -> System.out.println(key + ": " + value)); } } ``` 运行以上代码,将按照名字的首字母进行分组,并输出分组结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值