最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Stream distinct根據(jù)list某個字段去重的解決方案

 更新時間:2023年05月06日 10:36:52   作者:@大吉  
這篇文章主要介紹了Stream distinct根據(jù)list某個字段去重,stream的distinct去重方法,是根據(jù) Object.equals,和 Object.hashCode這兩個方法來判斷是否重復(fù)的,本文給大家介紹的非常詳細,需要的朋友可以參考下

需求:

List<UserPojo> users = new ArrayList<>();
//第一個user和第4個user應(yīng)該是相等的,因為它們的name和address相等
					//id   name     address    age
users.add(new UserPojo(1, "daji", "山東省青島市", 19));
users.add(new UserPojo(2, "daji2", "山東省濟南市", 20));
users.add(new UserPojo(3, "daji3", "北京市", 22));
users.add(new UserPojo(4, "daji, "山東省青島市", 23));

上面有4個user,對其進行去重,去重邏輯是根據(jù)name字段和address字段來決定(name和address字段相等 ,即可判定這兩個對象相等,不必關(guān)心其他字段是否相等)

因此:第一個user和第4個user應(yīng)該是相等的,因為它們的name和address相等

解決方案

stream的distinct去重方法,是根據(jù) Object.equals,和 Object.hashCode這兩個方法來判斷是否重復(fù)的。

所以我們可以利用這個特性 ,重寫pojo的 Object.equals,和 Object.hashCode這兩個方法,來實現(xiàn)。

1、重寫Object.equals方法

@Override
    public boolean equals(Object o) {
        UserPojo thisPojo = (UserPojo) o;
        //只有name 和 address 相等,也算相等
        if (this.getName().equals(thisPojo.getName()) && this.getAddress().equals(thisPojo.getAddress())){
            return true;
        }else {
            return false;
        }
    }

2、重寫Object.hashCode方法

重寫hashCode需要根據(jù)你選擇的字段重新計算。

本例就是根據(jù)name和address重新計算hashcode。規(guī)則如下圖:

最終方法:

@Override
    public int hashCode() {
        //根據(jù)name和address重新計算hashcode
        int result = getName().hashCode();
        //17是死值, jdk建議用17
        result = 17 * result + getAddress().hashCode();
        return result;
    }

3、使用distinct去重:

users = users.stream().distinct().collect(Collectors.toList());

結(jié)果(去重成功,去掉了一個重復(fù)值):

問題到此成功解決

4、[可選方案] 繼承pojo重寫equals和hashcode

如果我們不想動原有的pojo,我們可以新建一個新的pojo,來繼承原有的pojo。

1、 新建一個子類,繼承UserPojo
2、 重寫該子類的 equals方法和hashcode 方法
3、 將父類的全部數(shù)據(jù)灌入子類,對子類 使用stream的distinct去重

代碼如下:

@Test
    void test15() {
        List<UserPojo> users = new ArrayList<>();
        //第一個user和第4個user應(yīng)該是相等的,因為它們的name和address相等
        users.add(new UserPojo(1, "daji", "山東省青島市", 19));
        users.add(new UserPojo(2, "daji2", "山東省濟南市", 20));
        users.add(new UserPojo(3, "daji3", "北京市", 22));
        users.add(new UserPojo(4, "daji", "山東省青島市", 23));
        /*
            解決方案:使用stream的distinct去重
            1、 新建一個子類,繼承UserPojo
            2、 重寫該子類的 equals方法和hashcode 方法
            3、 將父類的全部數(shù)據(jù)灌入子類,對子類 使用stream的distinct去重
         */
        List<OverrideEqualsPojo> overrideEqualsPojos = new ArrayList<>();
        for (UserPojo user : users) {
            OverrideEqualsPojo overrideEqualsPojo = new OverrideEqualsPojo();
            BeanUtils.copyProperties(user,overrideEqualsPojo);
            overrideEqualsPojos.add(overrideEqualsPojo);
        }
        overrideEqualsPojos = overrideEqualsPojos.stream().distinct().collect(Collectors.toList());
        System.out.println(overrideEqualsPojos);
    }

子類pojo代碼:

package com.daji.stream;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Objects;
public class OverrideEqualsPojo extends UserPojo{
    public OverrideEqualsPojo(int id, String name, String address, int age) {
        super(id, name, address, age);
    }
    public OverrideEqualsPojo() {
    }
    @Override
    public boolean equals(Object o) {
        OverrideEqualsPojo thisPojo = (OverrideEqualsPojo) o;
        //只有name 和 address 相等,也算相等
        if (this.getName().equals(thisPojo.getName()) && this.getAddress().equals(thisPojo.getAddress())){
            return true;
        }else {
            return false;
        }
    }
    @Override
    public int hashCode() {
        //根據(jù)name和address重新計算hashcode
        int result = getName().hashCode();
        //17是死值, jdk建議用17
        result = 17 * result + getAddress().hashCode();
        return result;
    }
}

到此這篇關(guān)于Stream distinct根據(jù)list某個字段去重的文章就介紹到這了,更多相關(guān)Stream distinct 去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java如何從地址串中解析提取省市區(qū)(完美匹配中國所有地址)

    java如何從地址串中解析提取省市區(qū)(完美匹配中國所有地址)

    這篇文章主要給大家介紹了關(guān)于java如何從地址串中解析提取省市區(qū)的相關(guān)資料,通過這個方法可以完美匹配中國所有地址,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • idea提交文件時如何忽略某些文件的提交

    idea提交文件時如何忽略某些文件的提交

    這篇文章主要介紹了idea提交文件時如何忽略某些文件的提交問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解在Java中如何優(yōu)雅的停止線程

    詳解在Java中如何優(yōu)雅的停止線程

    線程,作為并發(fā)編程的基礎(chǔ)單元,允許程序同時執(zhí)行多個任務(wù),在Java中,線程可以理解為程序中的獨立執(zhí)行路徑,通過使用線程,開發(fā)者可以創(chuàng)建更加響應(yīng)靈敏、效率更高的應(yīng)用程序,本文小編將給大家介紹一下Java中如何優(yōu)雅的停止線程,需要的朋友可以參考下
    2023-11-11
  • 使用自定義注解實現(xiàn)加解密及脫敏方式

    使用自定義注解實現(xiàn)加解密及脫敏方式

    這篇文章主要介紹了使用自定義注解實現(xiàn)加解密及脫敏方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中的事件處理機制詳解

    Java中的事件處理機制詳解

    這篇文章主要介紹了Java中的事件處理機制詳解,Java事件處理是采取"委派事件模型",當(dāng)事件發(fā)生時,產(chǎn)生事件的對象,會把此"信息"傳遞給"事件的監(jiān)聽者"處理,這里所說的"信息"實際上就是java.awt.event事件類庫里某個類創(chuàng)建對象,把它稱為"事件的對象",需要的朋友可以參考下
    2023-10-10
  • HashMap vs TreeMap vs Hashtable vs LinkedHashMap

    HashMap vs TreeMap vs Hashtable vs LinkedHashMap

    這篇文章主要介紹了HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 利用POI讀取word、Excel文件的最佳實踐教程

    利用POI讀取word、Excel文件的最佳實踐教程

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 下面這篇文章主要給大家介紹了關(guān)于利用POI讀取word、Excel文件的最佳實踐的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • Java 仿天貓服裝商城系統(tǒng)的實現(xiàn)流程

    Java 仿天貓服裝商城系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個仿天貓服裝商城系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • Java與Mysql鎖相關(guān)知識總結(jié)

    Java與Mysql鎖相關(guān)知識總結(jié)

    這篇文章主要介紹了Java與Mysql鎖相關(guān)知識總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫

    Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫

    這篇文章主要給大家介紹了關(guān)于Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫的相關(guān)資料,JDBC是一種用于執(zhí)行SQL語句的Java?API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,需要的朋友可以參考下
    2023-12-12

最新評論

赤水市| 湘乡市| 根河市| 绥中县| 沧州市| 嘉义县| 隆安县| 河源市| 紫阳县| 义马市| 辽宁省| 固原市| 诸暨市| 兰考县| 车致| 江川县| 丹棱县| 奉化市| 乐安县| 兴义市| 肇东市| 盈江县| 宜春市| 长宁县| 都兰县| 桃园市| 克什克腾旗| 凤凰县| 鹤庆县| 同心县| 宣化县| 永安市| 十堰市| 蒙山县| 西吉县| 青海省| 浑源县| 镇宁| 西藏| 凉山| 桑日县|