如何从集合中筛选仅出现一次的元素?求Java Stream实现方案
用Java Stream筛选集合中仅出现一次的元素
你需要从集合中筛选出恰好出现一次的元素,完全移除所有重复出现的元素(哪怕重复多次,也不保留任何实例)。比如输入列表[1, 2, 3, 1, 4, 3, 5, 1],最终要得到[2, 4, 5]。以下是基于Stream API的解决方案:
方法一:先统计次数再过滤(严格保留原列表顺序)
这种方法分两步执行:先统计每个元素的出现次数,再遍历原列表过滤出次数为1的元素,结果顺序完全匹配原列表中元素的出现顺序。
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class UniqueElementsDemo { public static void main(String[] args) { List<Integer> originalList = Arrays.asList(1, 2, 3, 1, 4, 3, 5, 1); // 统计每个元素的出现次数 Map<Integer, Long> elementCountMap = originalList.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); // 过滤出仅出现一次的元素,保持原列表顺序 List<Integer> uniqueElements = originalList.stream() .filter(num -> elementCountMap.get(num) == 1) .collect(Collectors.toList()); System.out.println(uniqueElements); // 输出 [2, 4, 5] } }
方法二:分组后直接筛选(保留元素首次出现顺序)
如果不需要严格遵循原列表的完整顺序,仅需保持元素首次出现的顺序,可以在分组时使用LinkedHashMap维护顺序,再直接筛选符合条件的元素:
import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class UniqueElementsDemo { public static void main(String[] args) { List<Integer> originalList = Arrays.asList(1, 2, 3, 1, 4, 3, 5, 1); List<Integer> uniqueElements = originalList.stream() // 用LinkedHashMap分组,保留元素首次出现的顺序 .collect(Collectors.groupingBy( Function.identity(), LinkedHashMap::new, Collectors.counting() )) .entrySet().stream() .filter(entry -> entry.getValue() == 1) .map(Map.Entry::getKey) .collect(Collectors.toList()); System.out.println(uniqueElements); // 输出 [2, 4, 5] } }
补充说明
- 两种方法都通过Stream API封装了统计和过滤逻辑,比手动遍历统计更简洁易读。
- 单线程场景下无需额外处理线程安全;若使用并行流,统计时建议替换为
ConcurrentHashMap保证线程安全。
内容的提问来源于stack exchange,提问作者PebNischl
相关产品推荐
相关产品推荐

