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

如何从集合中筛选仅出现一次的元素?求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:07:22