lambda表达式不同对象根据对象某个属性去重

本文详细介绍如何使用Java Stream API进行集合操作,包括交集、并集、差集、去重及统计重复元素个数等高级应用。并通过实例展示了如何对两个List进行基于ID的去重,以及如何对大量数据进行去重并统计频率。

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

1.有时候有两个list对象,我们想要去重,比如:

List<User> userList和List<Person>personList

想通过User的id和Person的id进行去重,去掉userList中的User的id不等于personList中的Person的id的对象。

List<User> userList= userList.stream()
            .filter(user-> !personList.stream()
                .map(person ->person.getId())
                .collect(Collectors.toList())
                .contains(user.getId()))
          //  .filter(UniqueUtils.distinctByKey(person ->person.getId()))
         //   .peek(person  -> person .setId(UUIDUtil.uuid()))
            .collect(Collectors.toList());

2.list 交集/并集/差集/去重并集

     // 交集
        List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
        System.out.println("---得到交集 intersection---");
        intersection.parallelStream().forEach(System.out :: println);

        // 差集 (list1 - list2)
        List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
        System.out.println("---得到差集 reduce1 (list1 - list2)---");
        reduce1.parallelStream().forEach(System.out :: println);

        // 差集 (list2 - list1)
        List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
        System.out.println("---得到差集 reduce2 (list2 - list1)---");
        reduce2.parallelStream().forEach(System.out :: println);

        // 并集
        List<String> listAll = list1.parallelStream().collect(toList());
        List<String> listAll2 = list2.parallelStream().collect(toList());

      listAll.addAll(listAll2);
      System.out.println("---得到并集 listAll---");
      listAll.parallelStream().forEach(System.out :: println);

      // 去重并集
      List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
      System.out.println("---得到去重并集 listAllDistinct---");
      listAllDistinct.parallelStream().forEach(System.out :: println);

      System.out.println("---原来的List1---");
      list1.parallelStream().forEach(System.out :: println);
      System.out.println("---原来的List2---");
      list2.parallelStream().forEach(System.out :: println);

 3.stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合

//定义一个100元素的集合,包含A-Z
List<String> list = new LinkedList<>();
for (int i =0;i<100;i++){
    list.add(String.valueOf((char)('A'+Math.random()*('Z'-'A'+1))));
}
System.out.println(list);
//统计集合重复元素出现次数,并且去重返回hashmap
Map<String, Long> map = list.stream().
    collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
System.out.println(map);
//由于hashmap无序,所以在排序放入LinkedHashMap里(key升序)
Map<String, Long> sortMap = new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.comparingByKey()).
    forEachOrdered(e -> sortMap.put(e.getKey(), e.getValue()));
System.out.println(sortMap);
//获取排序后map的key集合
List<String> keys = new LinkedList<>();
sortMap.entrySet().stream().forEachOrdered(e -> keys.add(e.getKey()));
System.out.println(keys);
//获取排序后map的value集合
List<Long> values = new LinkedList<>();
sortMap.entrySet().stream().forEachOrdered(e -> values.add(e.getValue()));
System.out.println(values);
--------------------- 

 

转载于:https://www.cnblogs.com/heqiyoujing/p/9859144.html

使用lambda表达式对集合进行分组可以通过Stream的collect方法结合Collectors的groupingBy方法实现。具体步骤如下: 1. 首先,获取一个Stream对象,可以通过集合的stream()方法获得。 2. 调用collect方法,并传入Collectors的groupingBy方法作为参数,该方法接受一个Function对象,用于指定根据哪个属性进行分组。 3. 在groupingBy方法中,传入一个Lambda表达式或方法引用,用于指定根据哪个属性进行分组。Lambda表达式的参数为集合中的元素,返回为分组的依据属性。 4. collect方法的返回为一个Map对象,其中键为分组的属性为对应分组的元素列表。 下面是一个示例代码,演示如何使用lambda表达式对City对象集合按照城市名进行分组: ```java Map<String, List<City>> map = cities.stream() .collect(Collectors.groupingBy(City::getCity)); ``` 在上述代码中,cities为City对象的集合,getCity为City类的一个方法,返回城市名。通过调用stream()方法获取Stream对象,然后调用collect方法,并传入Collectors的groupingBy方法,以getCity作为分组的依据。最终得到的map对象中,键为城市名,为对应城市名的City对象列表。 参考资料: 2、分组 Map<String, List<City>> map = cities.stream().collect(Collectors.groupingBy(City :: getCity)); 主要介绍了lambda表达式解决java后台分组排序过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价,需要的朋友可以参考下。 我们经常会对list集合,于是我自己花了点时间将如何用 lambda表达式list集合做了封装和测试,方便以后快速使用。包括对对象集合中的某个属性等。如果有特殊的list要求,可以自行对下列方法进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值