欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java使用Stream流對自定義對象數(shù)組去重的實現(xiàn)

 更新時間:2025年04月16日 10:54:35   作者:Aaron?Fang  
本文主要介紹了java使用Stream流對自定義對象數(shù)組去重的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在 Java 中,使用 Stream 流對自定義對象數(shù)組去重的核心是確保對象能正確判斷“重復”的邏輯。以下是具體實現(xiàn)方法及場景分析:

方法 1:直接使用 distinct()(需重寫 equals 和 hashCode)

若自定義對象已正確重寫 equals() 和 hashCode() 方法,可直接通過 distinct() 去重。
適用場景:對象的唯一性由所有字段共同決定(如數(shù)據(jù)庫實體類的主鍵)。

示例代碼

public class Person {
    private String id;
    private String name;

    // 構造方法、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 = ...; // 自定義對象數(shù)組
List<Person> uniqueList = Arrays.stream(people)
        .distinct()
        .collect(Collectors.toList());

方法 2:基于對象的某個唯一屬性去重(無需重寫 equals 和 hashCode)

若無法修改對象類(如第三方庫的類),或需根據(jù)部分字段去重,可用 Collectors.toMap 或 TreeSet 實現(xiàn)。

(1) 使用 Collectors.toMap

適用場景:根據(jù)唯一鍵(如 id)去重,保留第一個出現(xiàn)的元素。

List<Person> uniqueList = Arrays.stream(people)
        .collect(Collectors.toMap(
                Person::getId, // Key 提取函數(shù)(根據(jù) id 去重)
                p -> p,       // Value 為對象本身
                (existing, replacement) -> existing // 沖突時保留已存在的元素
        ))
        .values()            // 獲取去重后的 Value 集合
        .stream()
        .collect(Collectors.toList());

(2) 使用 TreeSet 自定義比較器

適用場景:需要根據(jù)多個字段去重,或動態(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 + 內存狀態(tài)去重

適用場景:需根據(jù)動態(tài)條件去重(如去重后保留最后一個元素)。

(1) 使用 ConcurrentHashMap 維護狀態(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) 保留最后一個出現(xiàn)的元素

List<Person> uniqueList = Arrays.stream(people)
        .collect(Collectors.toMap(
                Person::getId,
                p -> p,
                (oldValue, newValue) -> newValue // 沖突時保留新元素
        ))
        .values()
        .stream()
        .collect(Collectors.toList());

總結回答

  • 直接去重:若對象重寫了 equals() 和 hashCode(),直接用 distinct()
  • 按屬性去重:使用 Collectors.toMap 或 TreeSet,根據(jù)唯一鍵(如 id)過濾。
  • 動態(tài)去重:通過 filter 配合內存集合(如 ConcurrentHashMap)控制去重邏輯。

關鍵點:明確業(yè)務中“重復”的定義(如全字段相等或部分字段相等),選擇性能與代碼簡潔性兼顧的方案。

到此這篇關于java使用Stream流對自定義對象數(shù)組去重的實現(xiàn)的文章就介紹到這了,更多相關java 自定義對象數(shù)組去重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • RocketMQ消息拉取過程詳解

    RocketMQ消息拉取過程詳解

    這篇文章主要為大家介紹了RocketMQ消息拉取過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • java基礎之字符串編碼知識點總結

    java基礎之字符串編碼知識點總結

    這篇文章主要介紹了java基礎之字符串編碼總結,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有很好的幫助,要的朋友可以參考下
    2021-04-04
  • IntelliJ IDEA 統(tǒng)一設置編碼為utf-8編碼的實現(xiàn)

    IntelliJ IDEA 統(tǒng)一設置編碼為utf-8編碼的實現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA 統(tǒng)一設置編碼為utf-8編碼的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-06-06
  • 使用Java反射機制提高SpringBoot的代碼質量和可維護性

    使用Java反射機制提高SpringBoot的代碼質量和可維護性

    保持好的代碼質量和遵守編碼標準是開發(fā)可維護和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來提高 Spring Boot 應用程序的代碼質量和可維護性,需要的朋友可以參考下
    2023-10-10
  • Java實現(xiàn)下載文件的6種方式

    Java實現(xiàn)下載文件的6種方式

    本文主要介紹了Java實現(xiàn)下載文件的6種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringCloud Config分布式配置中心使用教程介紹

    SpringCloud Config分布式配置中心使用教程介紹

    springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應用
    2022-12-12
  • java選擇框、單選框和單選按鈕

    java選擇框、單選框和單選按鈕

    本文給大家介紹的是java中選擇框、單選框和單選按鈕的操作方法,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-06-06
  • SpringBoot讀取excel表格的示例代碼

    SpringBoot讀取excel表格的示例代碼

    這篇文章主要介紹了SpringBoot讀取excel表格的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Mybatis以main方法形式調用dao層執(zhí)行代碼實例

    Mybatis以main方法形式調用dao層執(zhí)行代碼實例

    這篇文章主要介紹了Mybatis以main方法形式調用dao層執(zhí)行代碼實例,MyBatis 是一款優(yōu)秀的持久層框架,MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數(shù)和獲取結果集的工作,需要的朋友可以參考下
    2023-08-08
  • springboot如何獲取yml里面的屬性值

    springboot如何獲取yml里面的屬性值

    這篇文章主要介紹了springboot如何獲取yml里面的屬性值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論