Stream流实践(二):list 对象数组根据某字段去重的三种基本思路

前言

相信大家对于list简单数组的去重很熟悉了,例如以下代码

int[] arrays = {1, 2, 2, 2, 3, 3, 3};
    Arrays.stream(arrays).distinct().forEach(item -> {
        System.out.println("item ->" + item);
    });

那我们来探讨下,对于list中保存为对象的数组,根据内部对象的某一个字段去重有什么好的思路呢?
给出一个简单的Student对象

public class Student  {
    String id; 
    String index;
    String name;
}
	针对该Student对象,以下是我想到的三种方法去重方法

方法一:List.contains + Stream流

/**
 * @author: 代码丰
 * @Date: 2022/10/24 13:57
 * @Description:
 */
public class DeRepeatFromTwoListTest {

    public static void main(String[] args) {

        //测试1:去重两个列表的重复值 填充参数
        List<Student2> list1 = new ArrayList<>();
        List<Student2> list2 = new ArrayList<>();
        for(int i = 1;i<=5;i++){
            Student2 Student2 = new Student2();
            Student2.setId(String.valueOf(i));
            Student2.setIndex(String.valueOf(i));
            Student2.setName("name"+String.valueOf(i));
            list1.add(Student2);
        }
        for(int i = 1;i<=3;i++){
            Student2 Student2 = new Student2();
            Student2.setId(String.valueOf(i));
            Student2.setIndex(String.valueOf(i));
            Student2.setName("name"+String.valueOf(i));
            list2.add(Student2);
        }
        // 基本思路:
        // 1、将【数组流】转换为【字段流】
        // 2、流重新恢复数组
        // 3、然后再使用List.contains方法去过滤
        List<Student2> resultList = list1.stream()
                .filter(item -> !(list2.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId()))
                ).collect(Collectors.toList());
        System.out.println(resultList);
    }
}

方法二:Set不可重复特性 + Stream流

/**
 * @author: 代码丰
 * @Date: 2022/10/24 17:24
 * @Description:
 */
public class DeRepeatFromThreeListTest {
    public static void main(String[] args) {

        //测试2:去重一个列表的重复值
        List<Student> list = new ArrayList<>();
        for (int i = 1; i <= 5; i++) {

            Student student = new Student();
            student.setId("1");
            student.setIndex("1" + String.valueOf(i));
            student.setName("name" + String.valueOf(i));
            list.add(student);
        }
        //基本思路:利用set不可重复key特性
        List<Student> after = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getId))), ArrayList::new));
    }
}

方法三:concurrentHashMap的putIfAbsent + Stream流

/**
 * 去重工具类
 * @author 代码丰
 */
@Slf4j
public class CustomizeDistinctUtil {
    
    //基本思路
    //1.利用 ConcurrentHashMap 的 putIfAbsent(假如map中key对应的value不存在,放value进入map 假如map中key对应的value存在,返回key对应的value)
    //2. 构造 Predicate 返回值
    //     不存在时,putIfAbsent 得到null,== null比较后 会返回true 
    //3. filter true的得到保留 false的直接过滤 
    //4. 效果为只有不存在的才会保留,存在的都得到了过滤,即实现去重
    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}

/**
 * @author: 代码丰
 * @Date: 2022/10/24 17:24
 * @Description:
 */
public class DeRepeatFromOneListTest {
    public static void main(String[] args) {

        //测试3:去重一个列表的重复值
        List<Student> list = new ArrayList<>();

        for(int i = 1;i<=5;i++){
            Student student = new Student();
            student.setId("1");
            student.setIndex("1"+String.valueOf(i));
            student.setName("name"+String.valueOf(i));
            list.add(student);
        }
        
        List<Student> after= list.stream().filter(CustomizeDistinctUtil.distinctByKey(Student::getId)).collect(Collectors.toList());
    }
}

尾巴

大家学废了吗?

  • 19
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现JavaList<Map>的去重,可以使用以下方法: 引用\[1\]中的示例代码展示了如何使用HashMap来实现去重。首先,创建一个新的HashMap对象作为去重后的结果容器。然后,遍历原始的List<Map>,对于每个Map对象,检查其value是否已经存在于新的HashMap中。如果不存在,则将该Map对象添加到新的HashMap中。最后,打印出去重后的结果。 引用\[2\]中的示例代码展示了如何使用ArrayList的removeAll和addAll方法来实现去重。首先,创建两个ArrayList对象,分别存储原始的List<Map>和需要去重List<Map>。然后,使用removeAll方法将原始的List<Map>中与需要去重List<Map>中相同的元素移除。最后,使用addAll方法将需要去重List<Map>中的元素添加到原始的List<Map>中。最终,打印出去重后的结果。 引用\[3\]中的示例代码展示了如何使用Java 8的Stream API来实现List<Map>的去重。首先,使用stream方法将List<Map>转换为Stream对象。然后,使用filter方法和distinctByKey方法来过滤出不重复的Map对象。最后,使用collect方法将过滤后的结果收集到一个新的List中。最终,得到去重后的结果。 综上所述,可以根据具体需求选择适合的方法来实现List<Map>的去重。 #### 引用[.reference_title] - *1* *2* [javaList和Map的去重](https://blog.csdn.net/qingfoo/article/details/25284957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java8 List<Map> 根据map对象某个字段去重。](https://blog.csdn.net/weixin_40482816/article/details/117248416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值