色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

List 轉 Map的方法

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-09 16:10 ? 次閱讀

在我們平時的工作中,充滿了各種類型之間的轉換。今天小編帶大家上手 List 轉 Map 的各種操作。

我們將假設 List 中的每個元素都有一個標識符,該標識符將在生成的 Map 中作為一個鍵使用。

定義一個類型

我們在轉換之前,我們先暫定一個類來用于各種轉換demo的演示。

public class Animal {
    private int id;
    private String name;

    //  構造函數 、 get 、 set
}

我們假定 id 字段 是唯一的, 所以我們把 id 作為 Map 的key。

使用 Java 8 之前的方法

在使用Java 8 之前,就只能使用比較傳統的for 循環來轉換。

public Map< Integer, Animal > convertListBeforeJava8(List< Animal > list) {
    Map< Integer, Animal > map = new HashMap<  >();
    for (Animal animal : list) {
        map.put(animal.getId(), animal);
    }
    return map;
}

我們需要寫一個測試代碼,測試下是否正常運行了。

@Test
public void testConvertListBeforeJava8() {
    Map< Integer, Animal > map = convertListService
      .convertListBeforeJava8(list);
    
    assertThat(
      map.values(), 
      containsInAnyOrder(list.toArray()));
}

使用Java 8 stream

在Java 8 之后,我們可以通過新增的 Stream API 來進行轉換操作

public Map< Integer, Animal > convertListAfterJava8(List< Animal > list) {
    Map< Integer, Animal > map = list.stream()
      .collect(Collectors.toMap(Animal::getId, Function.identity()));
    return map;
}

測試代碼

@Test
public void testConvertListAfterJava8() {
    Map< Integer, Animal > map = convertListService.convertListAfterJava8(list);
    
    assertThat(
      map.values(), 
      containsInAnyOrder(list.toArray()));
}

使用Guava庫

除了使用核心的Java API ,我們還能通過第三方庫來實現這些操作。

使用Guava 庫, 我們需要先引入依賴, 我們先在maven 中引入進來。

< !-- https://mvnrepository.com/artifact/com.google.guava/guava -- >
< dependency >
    < groupId >com.google.guava< /groupId >
    < artifactId >guava< /artifactId >
    < version >31.0.1-jre< /version >
< /dependency >

接下來使用 Maps.uniqueIndex() 進行轉換

public Map< Integer, Animal > convertListWithGuava(List< Animal > list) {
    Map< Integer, Animal > map = Maps
      .uniqueIndex(list, Animal::getId);
    return map;
}

測試代碼

@Test
public void testConvertListWithGuava() {
    Map< Integer, Animal > map = convertListService
      .convertListWithGuava(list);
    
    assertThat(
      map.values(), 
      containsInAnyOrder(list.toArray()));
}

使用 Apache Commons 庫

除了 Guava ,我們還可以使用常用的 Apache Commons 庫來進行轉換。

我們現在Maven 中引入 commons 的依賴庫

< !-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -- >
< dependency >
    < groupId >org.apache.commons< /groupId >
    < artifactId >commons-collections4< /artifactId >
    < version >4.4< /version >
< /dependency >

接下來我們使用 MapUtils.populateMap() 方法進行轉換。

public Map< Integer, Animal > convertListWithApacheCommons2(List< Animal > list) {
    Map< Integer, Animal > map = new HashMap<  >();
    MapUtils.populateMap(map, list, Animal::getId);
    return map;
}

測試代碼

@Test
public void testConvertListWithApacheCommons2() {
    Map< Integer, Animal > map = convertListService
      .convertListWithApacheCommons2(list);
    
    assertThat(
      map.values(), 
      containsInAnyOrder(list.toArray()));
}

Map Key 的沖突問題

由于List中可以存在多個相同的實例, 但是map卻不行, 那我們來看看Map要怎么處理呢?

首先,我們初始化一個有重復對象的 List

@Before
public void init() {

    this.duplicatedIdList = new ArrayList<  >();

    Animal cat = new Animal(1, "Cat");
    duplicatedIdList.add(cat);
    Animal dog = new Animal(2, "Dog");
    duplicatedIdList.add(dog);
    Animal pig = new Animal(3, "Pig");
    duplicatedIdList.add(pig);
    Animal cow = new Animal(4, "牛");
    duplicatedIdList.add(cow);
    Animal goat= new Animal(4, "羊");
    duplicatedIdList.add(goat);
}

從代碼中可以看到, 牛 和 羊 對象的id 都是 4 。

Apache Commons 和 Java 8 之前的代碼是一樣的,相同id的Map 在put 的時候會進行覆蓋。

@Test
public void testConvertBeforeJava8() {

    Map< Integer, Animal > map = convertListService
      .convertListBeforeJava8(duplicatedIdList);

    assertThat(map.values(), hasSize(4));
    assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
}

@Test
public void testConvertWithApacheCommons() {

    Map< Integer, Animal > map = convertListService
      .convertListWithApacheCommons(duplicatedIdList);

    assertThat(map.values(), hasSize(4));
    assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
}

而 Java 8 的 Collectors.toMap() 和 Guava 的 MapUtils.populateMap() 分別拋出 IllegalStateException 和 IllegalArgumentException。

@Test(expected = IllegalStateException.class)
public void testGivenADupIdListConvertAfterJava8() {

    convertListService.convertListAfterJava8(duplicatedIdList);
}

@Test(expected = IllegalArgumentException.class)
public void testGivenADupIdListConvertWithGuava() {

    convertListService.convertListWithGuava(duplicatedIdList);
}

總結

在這篇文章中,指北君給大家分享了各種List 轉 Map 的方法, 給出了使用 Java 原生API 以及一些流行的第三方庫的例子。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62569
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • MAP
    MAP
    +關注

    關注

    0

    文章

    49

    瀏覽量

    15137
收藏 人收藏

    評論

    相關推薦

    OpenHarmony語言基礎類庫【@ohos.util.List (線性容器List)】

    List底層通過單向鏈表實現,每個節點有一個指向后一個元素的引用。當需要查詢元素時,必須從頭遍歷,插入、刪除效率高,查詢效率低。List允許元素為null。
    的頭像 發表于 05-10 16:57 ?732次閱讀
    OpenHarmony語言基礎類庫【@ohos.util.<b class='flag-5'>List</b> (線性容器<b class='flag-5'>List</b>)】

    add_ready_list_end

    ], &task_ptr->task_list);bit_set(rq->task_bit_map, priority);/*update highest_priority
    發表于 06-08 17:26

    labview中 list 列表實時讀取問題

    網上找了個程序,是關于 USBCAN的數據接收,但有些問題不明白。下圖 1 中的list 空間并沒放在while循環中,但該list控件能一直實時更新數據而list控件的程序框中的所
    發表于 09-05 10:19

    是否有指示MAP方法

    寄存器上的SRL。是否有指示MAP方法,它不應該在某些信號上推斷SRL?謝謝杰夫以上來自于谷歌翻譯以下為原文I have a design that has high clock rates.I
    發表于 10-10 10:52

    Map Service Engine Based On We

    Abstract:A design and implementation of map service engine based on web is introduced
    發表于 07-23 10:43 ?17次下載

    List of Equivalent Product

    List of Equivalent Product
    發表于 08-19 12:32 ?12次下載

    Allego中find by list使用方法

    Allego中find by list使用方法 先對每單張原理圖出bom表! 然后把他其中的標號 r1,c1,u1之類的放在另一個文本中,注意不要用逗號隔開! 將文
    發表于 03-22 16:24 ?1504次閱讀

    基于MAP+CMLLR的說話人識別中發聲力度問題

    為了改善發聲力度對說話人識別系統性能的影響,在訓練語音存在少量耳語、高喊語音數據的前提下,提出了使用最大后驗概率(MAP)和約束最大似然線性回歸(CMLLR)相結合的方法來更新說話人模型、投影轉換
    發表于 12-05 15:21 ?0次下載
    基于<b class='flag-5'>MAP</b>+CMLLR的說話人識別中發聲力度問題

    mapreduce 中MAP進程的數量怎么控制?

    1.如果想增加map個數,則設置mapred.map.tasks 為一個較大的值2.如果想減小map個數,則設置mapred.min.split.size 為一個較大的值3.如果輸入中有很多小文件,依然想減少
    發表于 01-02 14:04 ?1888次閱讀
    mapreduce 中<b class='flag-5'>MAP</b>進程的數量怎么控制?

    mapreduce設置map個數_mapreduce設置map內存

    map階段讀取數據前,FileInputFormat會將輸入文件分割成split,split的個數決定了map的個數。
    發表于 01-02 14:26 ?1.1w次閱讀
    mapreduce設置<b class='flag-5'>map</b>個數_mapreduce設置<b class='flag-5'>map</b>內存

    Python基礎變量類型—List分析

    本文基于Python基礎,主要介紹了Python基礎中list列表,通過list列表的兩個函數 ,對list的語法做了詳細的講解,用豐富的案例 ,代碼效果圖的展示幫助大家更好理解 。
    的頭像 發表于 12-24 17:37 ?1089次閱讀

    Automotive Recommended Products List

    Automotive Recommended Products List
    發表于 02-03 15:27 ?0次下載
    Automotive Recommended Products <b class='flag-5'>List</b>

    什么是 map

    map 容器,又稱鍵值對容器,即該容器的底層是以紅黑樹變體實現的,是典型的關聯式容器。這意味著,map 容器中的元素可以分散存儲在內存空間里,而不是必須存儲在一整塊連續的內存空間中。跟任意其它類型容器一樣,它能夠存放各種類型的對象。
    的頭像 發表于 02-27 15:41 ?2924次閱讀

    什么是list

    list 容器,又稱雙向鏈表容器,即該容器的底層是以雙向鏈表的形式實現的。這意味著,list 容器中的元素可以分散存儲在內存空間里,而不是必須存儲在一整塊連續的內存空間中。
    的頭像 發表于 02-27 15:52 ?2365次閱讀

    Java8的Stream流 map() 方法

    之后,對集合可以進行 Stream 操作,使上面的處理更簡潔。 概述 Stream 流式處理中有 map() 方法,先看下其定義,該方法在java.util.stream.Stream類中 可以看到
    的頭像 發表于 09-25 11:06 ?1828次閱讀
    Java8的Stream流 <b class='flag-5'>map</b>() <b class='flag-5'>方法</b>
    主站蜘蛛池模板: 91区国产福利在线观看午夜 | 国产女人毛片| 国产精品嫩草免费视频| 国产精品一区二区AV97| 国产中文视频无码成人精品| 交换邻居波多野结衣中文字幕| 久久不射网| 美女诱点第6季| 日本经典片免费看| 无人区尖叫之夜美女姐姐视频| 亚洲人成人77777在线播放| 在线观看免费毛片| www.免费视频| 国产麻豆剧果冻传媒免费网站| 久久精品电影| 日本久久精品免视看国产成人| 午夜福利08550| 中文字幕不卡在线高清| 纯肉无码AV在线看免费看| 国产色精品VR一区二区| 美女伊人网| 我半夜摸妺妺的奶C了她软件| 一本之道高清在线观看一区| BL文高H强交| 好嗨哟在线看片免费| 蜜臀色欲AV无人A片一区| 色偷偷亚洲天堂| 在线观看国产精美视频| 动漫美女3d被爆漫画| 久久re视频这里精品09首页 | 久久视频这里只精品99re8久| 欧美一区二区激情视频| 亚洲国产精品自在自线观看 | 国产专区亚洲欧美另类在线| 米奇影视999| 小莹的性荡生活40章| 91蜜桃视频| 国产一区内射最近更新| 欧美午夜福利主线路| 亚洲精品久久久WWW游戏好玩| bt成人种子|