You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8中如何智能去除List<T>中的连续重复元素?

移除List中连续相邻重复元素的Java 8优雅实现

我太懂这种需求了!常规的distinct()或者转Set完全不顶用——它们是全局去重,根本解决不了“只移除连续相邻重复元素”的场景。刚好Java 8的Stream或者增强库StreamEx能给出简洁可读的解决方案,给你分享两种靠谱思路:

方案一:纯Java 8原生Stream实现

原生Stream本身没有直接处理状态的操作,但我们可以借助Collectors.collectingAndThen结合遍历逻辑来实现,完全不用额外依赖:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ConsecutiveDuplicateHandler {
    public static <T> List<T> removeConsecutiveDuplicates(List<T> inputList) {
        if (inputList == null || inputList.isEmpty()) {
            return new ArrayList<>();
        }
        
        return inputList.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toList(),
                        collectedList -> {
                            List<T> result = new ArrayList<>();
                            T previous = null;
                            
                            for (T current : collectedList) {
                                // 仅当当前元素和上一个不同时,才加入结果集
                                if (previous == null || !current.equals(previous)) {
                                    result.add(current);
                                    previous = current;
                                }
                            }
                            return result;
                        }
                ));
    }

    public static void main(String[] args) {
        List<String> original = List.of("A","A","A","B","B","A","A","A","C","C","C","A","A","B","B","A");
        List<String> cleaned = removeConsecutiveDuplicates(original);
        System.out.println(cleaned); // 输出: [A, B, A, C, A, B, A]
    }
}

这个方案的逻辑非常直白:先把所有元素收集到List,再遍历的时候只保留和前一个元素不同的项,完全用原生API就能实现,不用引入任何第三方库。

方案二:用StreamEx实现(极致简洁)

如果你项目里已经引入了StreamEx(Java Stream的增强库),那这个问题一行代码就能搞定——StreamEx专门提供了dedup()方法,默认就是移除连续相邻的重复元素:

首先先引入StreamEx的依赖(以Maven为例):

<dependency>
    <groupId>one.util</groupId>
    <artifactId>streamex</artifactId>
    <version>0.8.1</version>
</dependency>

然后实现代码:

import one.util.streamex.StreamEx;
import java.util.List;

public class ConsecutiveDuplicateHandler {
    public static void main(String[] args) {
        List<String> original = List.of("A","A","A","B","B","A","A","A","C","C","C","A","A","B","B","A");
        List<String> cleaned = StreamEx.of(original)
                .dedup()
                .toList();
        
        System.out.println(cleaned); // 输出: [A, B, A, C, A, B, A]
    }
}

dedup()方法内部已经封装了连续重复的判断逻辑,代码简洁到爆炸,可读性拉满。而且它还支持自定义重复判断规则,比如忽略大小写的连续去重:

// 示例:忽略大小写的连续重复移除
List<String> caseInsensitiveCleaned = StreamEx.of(original)
        .dedup(String::equalsIgnoreCase)
        .toList();

内容的提问来源于stack exchange,提问作者Mbded

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:49:33