【Java中List集合对象去重及按属性去重的8种方法】 在Java编程中,当我们处理包含重复元素的List时,有时需要去除其中的重复项。以下文章将详细介绍8种针对List集合对象去重的方法,包括基于对象整体以及按特定属性进行去重。 ### 一、对象整体去重 #### 1. 使用Set(HashSet) 这是最基础的方法,通过将List转换为Set,由于Set不允许重复元素,所以转换后的Set中不会有重复的元素。但请注意,Set的无序性意味着原始List的顺序可能会丢失。 ```java @Test void testRemove1() { List<String> newList = new ArrayList<>(new HashSet<>(list)); System.out.println("去重后的集合:" + newList); } ``` #### 2. 使用Stream API的distinct() Stream API提供了一个方便的`distinct()`方法,用于去除重复元素。它同样不保留原始顺序,但可以通过`sorted()`方法进行排序。 ```java @Test void testRemove2() { List<String> newList = list.stream().distinct().collect(Collectors.toList()); System.out.println("去重后的集合:" + newList); } ``` #### 3. 使用HashSet和Iterator 这种方法保持了元素的原始顺序,但代码稍微复杂一些。 ```java @Test void testRemove3() { Set<String> set = new HashSet<>(); List<String> newList = new ArrayList<>(); for (String item : list) { if (!set.contains(item)) { set.add(item); newList.add(item); } } System.out.println("去重后的集合:" + newList); } ``` #### 4. 使用LinkedHashSet和Iterator 如果需要保持元素的插入顺序,可以使用LinkedHashSet。 ```java @Test void testRemove4() { Set<String> set = new LinkedHashSet<>(); List<String> newList = new ArrayList<>(); for (String item : list) { set.add(item); } newList.addAll(set); System.out.println("去重后的集合:" + newList); } ``` ### 二、按属性去重 #### 5. 自定义Comparator 对于包含自定义对象的List,可以实现一个比较器(Comparator)来根据对象的特定属性进行去重。 ```java @Test void testRemoveByAttribute1() { List<Player> uniquePlayers = playerList.stream() .distinct(Comparator.comparing(Player::getName)) .collect(Collectors.toList()); System.out.println("按名字去重后的集合:" + uniquePlayers); } ``` #### 6. 自定义equals()和hashCode() 如果对象类已实现`equals()`和`hashCode()`,可以直接使用上述对象整体去重的方法。 #### 7. Lambda表达式和Map 利用Lambda表达式和Map的特性,可以根据属性去重。 ```java @Test void testRemoveByAttribute2() { Map<String, Player> map = playerList.stream() .collect(Collectors.toMap(Player::getName, p -> p, (p1, p2) -> p1)); List<Player> uniquePlayers = new ArrayList<>(map.values()); System.out.println("按名字去重后的集合:" + uniquePlayers); } ``` #### 8. 自定义方法 创建一个自定义方法,传入List和比较属性,根据属性值去重。 ```java public static <T> List<T> removeDuplicates(List<T> list, Function<T, Object> attributeExtractor) { return list.stream() .collect(Collectors.collectingAndThen( Collectors.toMap(attributeExtractor, Function.identity(), (a, b) -> a, LinkedHashMap::new), map -> new ArrayList<>(map.values()) )); } @Test void testRemoveByAttribute3() { List<Player> uniquePlayers = removeDuplicates(playerList, Player::getName); System.out.println("按名字去重后的集合:" + uniquePlayers); } ``` 以上就是对Java中List集合对象去重及按属性去重的8种方法的详细解释。每种方法都有其适用场景,开发者应根据实际需求选择合适的方法。在实现这些方法时,要确保对象的`equals()`和`hashCode()`方法正确实现,以保证去重的准确性。


























- weixin_407349552023-11-22资源内容总结的很到位,内容详实,很受用,学到了~

- 粉丝: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- modelcontextprotocol_swift-sdk-AI人工智能资源
- 西门子1200 PLC与台达DTK温控器485通讯程序详解及应用
- Screenshot_20250728_234428_com.pi.czrxdfirst.jpg
- ZeroLaunch-rs-Rust资源
- 单相并网逆变器AFD孤岛检测仿真:基于主动移频法的频率稳定与触发保护技术研究 - 孤岛检测 详细版
- 西门子1200 PLC与台达DTK温控器485通讯程序解析及应用
- COMSOL 5.6 超声兰姆波单一模态有限元仿真用于电路板缺陷检测的技术解析 - 材料科学
- FPGA与Verilog:SPWM控制三相电机的实践教程及代码解析 SPWM
- ThinkCMF-移动应用开发资源
- 西门子1200博途V14电梯控制系统详解:状态机与WinCC画面应用
- 51单片机直流电机PID的PWM调速系统:Protues仿真、Keil仿真、器件清单和AD原理图,功能涵括直流电机目标速度设定、直流电机当前转速检测,并通过独立按键控制,应用PID算法进行电力调速,并
- MATLAB中的新型Spectral-Spatial奇异谱分析技术:用于高光谱成像近实时现场特征提取
- Pinecone_Pi_Nano-单片机开发资源
- 机器人路径规划中GA-DWA算法:遗传优化与动态窗口法融合的技术应用
- MATLAB中已调通程序:短时傅里叶变换(STFT)与连续小波变换(CWT)可直接运行
- XueYi-MultiSaas-Typescript资源


