java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn)
在 Java 中,使用 Stream 流對(duì)自定義對(duì)象數(shù)組去重的核心是確保對(duì)象能正確判斷“重復(fù)”的邏輯。以下是具體實(shí)現(xiàn)方法及場(chǎng)景分析:
方法 1:直接使用 distinct()(需重寫 equals 和 hashCode)
若自定義對(duì)象已正確重寫 equals()
和 hashCode()
方法,可直接通過 distinct()
去重。
適用場(chǎng)景:對(duì)象的唯一性由所有字段共同決定(如數(shù)據(jù)庫實(shí)體類的主鍵)。
示例代碼
public class Person { private String id; private String name; // 構(gòu)造方法、Getter/Setter 省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); // 根據(jù) id 判斷是否相等 } @Override public int hashCode() { return Objects.hash(id); // 基于 id 生成哈希 } } // 使用 Stream 去重 Person[] people = ...; // 自定義對(duì)象數(shù)組 List<Person> uniqueList = Arrays.stream(people) .distinct() .collect(Collectors.toList());
方法 2:基于對(duì)象的某個(gè)唯一屬性去重(無需重寫 equals 和 hashCode)
若無法修改對(duì)象類(如第三方庫的類),或需根據(jù)部分字段去重,可用 Collectors.toMap
或 TreeSet
實(shí)現(xiàn)。
(1) 使用 Collectors.toMap
適用場(chǎng)景:根據(jù)唯一鍵(如 id
)去重,保留第一個(gè)出現(xiàn)的元素。
List<Person> uniqueList = Arrays.stream(people) .collect(Collectors.toMap( Person::getId, // Key 提取函數(shù)(根據(jù) id 去重) p -> p, // Value 為對(duì)象本身 (existing, replacement) -> existing // 沖突時(shí)保留已存在的元素 )) .values() // 獲取去重后的 Value 集合 .stream() .collect(Collectors.toList());
(2) 使用 TreeSet 自定義比較器
適用場(chǎng)景:需要根據(jù)多個(gè)字段去重,或動(dòng)態(tài)指定去重規(guī)則。
List<Person> uniqueList = Arrays.stream(people) .collect(Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(p -> p.getId() + p.getName())) )) .stream() .collect(Collectors.toList());
方法 3:使用 filter + 內(nèi)存狀態(tài)去重
適用場(chǎng)景:需根據(jù)動(dòng)態(tài)條件去重(如去重后保留最后一個(gè)元素)。
(1) 使用 ConcurrentHashMap 維護(hù)狀態(tài)
Set<String> seenIds = ConcurrentHashMap.newKeySet(); List<Person> uniqueList = Arrays.stream(people) .filter(p -> seenIds.add(p.getId())) // 若 id 未出現(xiàn)過,保留 .collect(Collectors.toList());
(2) 保留最后一個(gè)出現(xiàn)的元素
List<Person> uniqueList = Arrays.stream(people) .collect(Collectors.toMap( Person::getId, p -> p, (oldValue, newValue) -> newValue // 沖突時(shí)保留新元素 )) .values() .stream() .collect(Collectors.toList());
總結(jié)回答
- 直接去重:若對(duì)象重寫了
equals()
和hashCode()
,直接用distinct()
。 - 按屬性去重:使用
Collectors.toMap
或TreeSet
,根據(jù)唯一鍵(如id
)過濾。 - 動(dòng)態(tài)去重:通過
filter
配合內(nèi)存集合(如ConcurrentHashMap
)控制去重邏輯。
關(guān)鍵點(diǎn):明確業(yè)務(wù)中“重復(fù)”的定義(如全字段相等或部分字段相等),選擇性能與代碼簡(jiǎn)潔性兼顧的方案。
到此這篇關(guān)于java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java 自定義對(duì)象數(shù)組去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基礎(chǔ)之字符串編碼知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了java基礎(chǔ)之字符串編碼總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,要的朋友可以參考下2021-04-04IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn)
這篇文章主要介紹了IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2020-06-06使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性
保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下2023-10-10SpringCloud Config分布式配置中心使用教程介紹
springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-12-12Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實(shí)例
這篇文章主要介紹了Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實(shí)例,MyBatis 是一款優(yōu)秀的持久層框架,MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下2023-08-08