Stream流还可以这样用,省时又省力,你不知道的去重方法,快来一起解决这道常见的面试题吧

本文总结了多种Java集合去重的方法,包括使用Stream API的collectingAndThen、filter及distinct方法,以及利用TreeSet、LinkedHashSet和Set等数据结构进行去重。每种方法都附有详细的代码示例。

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

下面归纳出几种常见的去重方法:

使用stream流collectingAndThen()
//根据某一属性去重
studentList = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                // 利用 TreeSet 的排序去重构造函数来达到去重元素的目的

                () -> new TreeSet<>(Comparator.comparing(Student::getId))), ArrayList::new));
通过filter方法去重
我们首先创建一个方法作为 Stream.filter() 的参数,其返回类型为 Predicate,原理就是判断一个元素能否加入到 Set 中去,代码如下:
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}
studentList = studentList.stream().filter(distinctByKey(Student::getName)).collect(Collectors.toList());
distinct去重一般都是用于去重List<String>这样的列表集合,他要求两个元素的所有属性全部一样
studentList = studentList.stream().distinct().collect(Collectors.toList());
linkHashSet去重
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
ArrayList<String> list = new ArrayList<>();
linkedHashSet.addAll(list);
list.clear();
list.addAll(linkedHashSet);
set去重
利用Map的key属性  不可重复
ArrayList<String> list = new ArrayList<>();
Set set = new HashSet();
list.stream().forEach(s -> {
    set.add(s);
});
嵌套循环去重
Arrays.sort(list.toArray());
for (int i =0;i<list.size()-1;i++){
    for (int j=list.size()-1;j>i;j--){
         if(list.get(j).equals(list.get(i))){
             list.remove(j);
         }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值