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

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

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

在 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)文章

  • RocketMQ消息拉取過程詳解

    RocketMQ消息拉取過程詳解

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

    java基礎(chǔ)之字符串編碼知識(shí)點(diǎn)總結(jié)

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

    IntelliJ 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ù)性

    使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

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

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

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

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

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

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

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

    SpringBoot讀取excel表格的示例代碼

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

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

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

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

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

最新評(píng)論