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
相关产品推荐
相关产品推荐

