HashMap將實(shí)體類對象設(shè)為key

記錄一個最近遇到的問題,當(dāng)需要對一個List的數(shù)據(jù)分組時声搁,通常我們會使用stream的grouping by方法,它通常會將List按某個字段或?qū)傩灾捣纸M,然后返回一個Map<String, List>結(jié)構(gòu)類型芹枷。

但有些時候你需要對多個字段分組,這時候有兩種解決辦法莲趣,第一種可以繼續(xù)使用grouping by方法鸳慈,對兩個字段進(jìn)行拼接,例如:

        Map<String, List<BillReceiptQueryDto>> map = temp.stream()
                .collect(Collectors.groupingBy(o -> o.getCustomerId() + "##" + o.getMonthYear()));

但有時候你就是不想用這種看起來有點(diǎn)簡陋的寫法喧伞,這就回到了標(biāo)題走芋,將實(shí)體類對象設(shè)置為HashMap的key绩郎。

我創(chuàng)建了一個實(shí)體類,其中包含3個我想要分組的字段翁逞,因?yàn)槲也幌?#連接3個字段看起來太丑了肋杖。很容易想象,如果只有g(shù)et set方法那大概率在你put進(jìn)map里之后挖函,下次遇到3個字段完全相同的實(shí)體類還是會當(dāng)作新key被put進(jìn)去而不是加入舊的組里状植。

public class ReceiptUpdateEntity {

    private Date billMonth;

    private String customerId;

    private String productId;

    public Date getBillMonth() {
        return billMonth;
    }

    public void setBillMonth(Date billMonth) {
        this.billMonth = billMonth;
    }

    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

   
}

如下我創(chuàng)建了一個簡單的測試方法,將3個值都賦值相同的兩個對象先后作為key put怨喘、containsKey浅萧,校驗(yàn)后發(fā)現(xiàn)輸出false,和預(yù)料中一樣HashMap并沒有判斷兩個對象相同哲思。解決辦法就是重寫這個類的equals和hashCode方法洼畅,用idea自動生成就行,只有這樣才能讓HashMap在識別的時候判斷這兩個對象是相同的棚赔。

Date temp = DateUtil.convert("2023-10-01 00:00:00", DateUtil.format1);
Date temp2 = DateUtil.convert("2023-10-01 00:00:00", DateUtil.format1);

Map<ReceiptUpdateEntity, List<CustomerProductTj>> collect = new HashMap<>();
ReceiptUpdateEntity updateEntity = new ReceiptUpdateEntity();
String customerId = "123456789";
String productId = "123456798";
updateEntity.setBillMonth(temp);
updateEntity.setCustomerId(customerId);
updateEntity.setProductId(productId);
collect.put(updateEntity, null);

ReceiptUpdateEntity updateEntity2 = new ReceiptUpdateEntity();
String customerId2 = "123456789";
String productId2 = "123456798";
updateEntity2.setBillMonth(temp2);
updateEntity2.setCustomerId(customerId2);
updateEntity2.setProductId(productId2);
System.out.println(collect.containsKey(updateEntity2));

ReceiptUpdateEntity updateEntity3 = new ReceiptUpdateEntity();
String customerId3 = "123456789";
String productId3 = "";
updateEntity3.setBillMonth(temp2);
updateEntity3.setCustomerId(customerId3);
updateEntity3.setProductId(productId3);
System.out.println(collect.containsKey(updateEntity3));

// 可以在Map里使用對象作為key 但需要重寫這個對象類的equals和hashcode方法
 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ReceiptUpdateEntity that = (ReceiptUpdateEntity) o;
        return billMonth.equals(that.billMonth) && customerId.equals(that.customerId) && productId.equals(that.productId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(billMonth, customerId, productId);
    }

    @Override
    public String toString() {
        return "ReceiptUpdateEntity{" +
                "billMonth=" + billMonth +
                ", customerId='" + customerId + '\'' +
                ", productId='" + productId + '\'' +
                '}';
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帝簇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靠益,更是在濱河造成了極大的恐慌丧肴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧后,死亡現(xiàn)場離奇詭異芋浮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)壳快,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門纸巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眶痰,你說我怎么就攤上這事瘤旨。” “怎么了竖伯?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵存哲,是天一觀的道長。 經(jīng)常有香客問我七婴,道長祟偷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任打厘,我火速辦了婚禮修肠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婚惫。我一直安慰自己氛赐,他們只是感情好魂爪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艰管,像睡著了一般滓侍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牲芋,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天撩笆,我揣著相機(jī)與錄音,去河邊找鬼缸浦。 笑死夕冲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裂逐。 我是一名探鬼主播歹鱼,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卜高!你這毒婦竟也來了弥姻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤掺涛,失蹤者是張志新(化名)和其女友劉穎庭敦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薪缆,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秧廉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拣帽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼电。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诞外,靈堂內(nèi)的尸體忽然破棺而出澜沟,到底是詐尸還是另有隱情,我是刑警寧澤峡谊,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站刊苍,受9級特大地震影響既们,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜正什,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一啥纸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婴氮,春花似錦斯棒、人聲如沸盾致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庭惜。三九已至,卻和暖如春穗酥,著一層夾襖步出監(jiān)牢的瞬間护赊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工砾跃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骏啰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓抽高,卻偏偏與公主長得像判耕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翘骂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容