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

Java使用Stream流的Lambda語(yǔ)法進(jìn)行List轉(zhuǎn)Map的操作方式

 更新時(shí)間:2025年05月07日 09:48:46   作者:Armyyyyy丶  
這篇文章主要介紹了Java使用Stream流的Lambda語(yǔ)法進(jìn)行List轉(zhuǎn)Map的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

注:標(biāo)題的<>被替換成了《》,標(biāo)題帶有<>會(huì)因?yàn)锽ug被吞。

背景

在平時(shí)開(kāi)發(fā)過(guò)程中難免會(huì)碰到有些時(shí)候需要將一個(gè)List轉(zhuǎn)成Map又或者是將Map轉(zhuǎn)成List,我們可以采用粗暴的方式來(lái)進(jìn)行轉(zhuǎn)換,但這樣一是不夠優(yōu)雅,二是數(shù)據(jù)過(guò)多的時(shí)候性能不是很高。

Lambda如果平時(shí)經(jīng)常使用就可以知道這種語(yǔ)法糖有多方便使用,可以讓代碼變得十分簡(jiǎn)潔,而本篇便是用來(lái)說(shuō)明使用Stream流的Lambda語(yǔ)法來(lái)優(yōu)雅的進(jìn)行List和Map的互轉(zhuǎn)操作,并分析其性能差異。

一些簡(jiǎn)單的便不做分析了,比如map()、peek()、filter()等方法,主要著重分析collect()的toMap()方法。

Stream流的Lambda語(yǔ)法應(yīng)用實(shí)例

1、定義要操作的UserDto

先定義一個(gè)UserDto以便直接后續(xù)使用,其代碼如下:

public class UserDto {
    private String name;
    private String sex;
    private String job;
    @Override
    public String toString() {
        return "{\"name\":\"" + name +
                "\",\"sex\":\"" + sex +
                "\",\"job\":\"" + job + "\"}";
    
    }
    // 后面其它的屬性和getter、setter方法都忽略
}

2、List轉(zhuǎn)成Map

List轉(zhuǎn)成Map有很多方式,使用foreach的方式什么轉(zhuǎn)換都可以完成,但在本篇將會(huì)分享幾個(gè)遍歷的操作。

List《UserDto》轉(zhuǎn)成Map《String, UserDto》

首先分享一下最簡(jiǎn)單的轉(zhuǎn)換:

由List<UserDto>轉(zhuǎn)成以UserDto的name當(dāng)成Key,而UserDto當(dāng)成Value的Map操作,即Map<String, UserDto>形式。

代碼如下:

public class MainTest {
    public static void main(String[] args) {
        UserDto userDto1 = new UserDto("test1", "man", "worker1");
        UserDto userDto2 = new UserDto("test2", "woman", "worker2");
        UserDto userDto3 = new UserDto("test3", "woman", "worker2");
        UserDto userDto4 = new UserDto("test4", "man", "worker3");
        List<UserDto> userList = Arrays
            .asList(userDto1, userDto2, userDto3, userDto4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, UserDto> userMap = userList.stream()
            .collect(Collectors.toMap(UserDto::getName, dto2 -> dto2));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{"name":"test1","sex":"man","job":"worker1"}, {"name":"test2","sex":"woman","job":"worker2"}, 
{"name":"test3","sex":"woman","job":"worker2"}, {"name":"test4","sex":"man","job":"worker3"}]


{test4={"name":"test4","sex":"man","job":"worker3"},test2={"name":"test2","sex":"woman","job":"worker2"}, 
test3={"name":"test3","sex":"woman","job":"worker2"},test1={"name":"test1","sex":"man","job":"worker1"}}

List《UserDto》轉(zhuǎn)成Map《String, Map《String, Object》》

接下來(lái)分享下將List<UserDto>轉(zhuǎn)成Map<String, Map<String, Object>>形式的Lambda操作:

public class MainTest {
    public static void main(String[] args) {
        UserDto userDto1 = new UserDto("test1", "man", "worker1");
        UserDto userDto2 = new UserDto("test2", "woman", "worker2");
        UserDto userDto3 = new UserDto("test3", "woman", "worker2");
        UserDto userDto4 = new UserDto("test4", "man", "worker3");
        List<UserDto> userList = Arrays
            .asList(userDto1, userDto2, userDto3, userDto4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, Map<String, Object>> userMap = userList.stream()
        .collect(Collectors.toMap(UserDto::getName, dto2 ->
                new HashMap<String, Object>(){{
                    put("name", dto2.getName());
                    put("sex", dto2.getSex());
                    put("job", dto2.getJob());}}));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{"name":"test1","sex":"man","job":"worker1"}, {"name":"test2","sex":"woman","job":"worker2"}, 
{"name":"test3","sex":"woman","job":"worker2"}, {"name":"test4","sex":"man","job":"worker3"}]


{test4={sex=man, name=test4, job=worker3}, test2={sex=woman, name=test2, job=worker2},
test3={sex=woman, name=test3, job=worker2}, test1={sex=man, name=test1, job=worker1}}

List《UserDto》轉(zhuǎn)Map《String, String》

接下來(lái)分享下將List<UserDto>轉(zhuǎn)成Map<String, String>形式的Lambda操作,當(dāng)然Map中String泛型也可以是Integer、Long甚至其它的類(lèi)型,按照下面的方式進(jìn)行相應(yīng)的替換就行了:

public class MainTest {
    public static void main(String[] args) {
        UserDto userDto1 = new UserDto("test1", "man", "worker1");
        UserDto userDto2 = new UserDto("test2", "woman", "worker2");
        UserDto userDto3 = new UserDto("test3", "woman", "worker2");
        UserDto userDto4 = new UserDto("test4", "man", "worker3");
        List<UserDto> userList = Arrays
            .asList(userDto1, userDto2, userDto3, userDto4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, String> userMap = userList.stream()
        .collect(Collectors.toMap(UserDto::getName, UserDto::getSex));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{"name":"test1","sex":"man","job":"worker1"}, {"name":"test2","sex":"woman","job":"worker2"}, 
{"name":"test3","sex":"woman","job":"worker2"}, {"name":"test4","sex":"man","job":"worker3"}]


{test4=man, test2=woman, test3=woman, test1=man}

List《Map《String, Object》》轉(zhuǎn)Map《String, UserDto》

由List<Map<String, Object>>轉(zhuǎn)Map<String, UserDto>操作中,Map中的String也可以是Long、Integer或者其它的類(lèi)型:

public class MainTest {
    public static void main(String[] args) {
        Map<String, Object> userMap1 = new HashMap<String, Object>(8) {{
            put("name", "test1");put("sex", "man");put("job", "worker1");
        }};
        Map<String, Object> userMap2 = new HashMap<String, Object>(8) {{
            put("name", "test2");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap3 = new HashMap<String, Object>(8) {{
            put("name", "test3");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap4 = new HashMap<String, Object>(8) {{
            put("name", "test4");put("sex", "man");put("job", "worker3");
        }};
        List<Map<String, Object>> userList = Arrays.asList(userMap1, userMap2, userMap3, userMap4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, UserDto> userMap = userList.stream()
                .collect(Collectors.toMap(map1 -> (String) map1.get("name"), map2 ->
                        new UserDto((String) map2.get("name"), (String) map2.get("sex"), (String) map2.get("job"))));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{name=test1, job=worker1, sex=man}, {name=test2, job=worker2, sex=woman}, 
{name=test3, job=worker2, sex=woman}, {name=test4, job=worker3, sex=man}]


{test4={"name":"test4","sex":"man","job":"worker3"}, test2={"name":"test2","sex":"woman","job":"worker2"}, 
test3={"name":"test3","sex":"woman","job":"worker2"}, test1={"name":"test1","sex":"man","job":"worker1"}}

List《Map《String, Object》》轉(zhuǎn)Map《String, String》

由List<Map<String, Object>>轉(zhuǎn)Map<String, String>操作中,Map中的String也可以是Long、Integer或者其它的類(lèi)型:

public class MainTest {
    public static void main(String[] args) {
        Map<String, Object> userMap1 = new HashMap<String, Object>(8) {{
            put("name", "test1");put("sex", "man");put("job", "worker1");
        }};
        Map<String, Object> userMap2 = new HashMap<String, Object>(8) {{
            put("name", "test2");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap3 = new HashMap<String, Object>(8) {{
            put("name", "test3");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap4 = new HashMap<String, Object>(8) {{
            put("name", "test4");put("sex", "man");put("job", "worker3");
        }};
        List<Map<String, Object>> userList = Arrays.asList(userMap1, userMap2, userMap3, userMap4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, String> userMap = userList.stream()
                .collect(Collectors.toMap(map1 -> (String) map1.get("name"), 
                    map2 -> (String) map2.get("sex")));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{name=test1, job=worker1, sex=man}, {name=test2, job=worker2, sex=woman}, {name=test3, job=worker2, sex=woman}, {name=test4, job=worker3, sex=man}]

{test4=man, test2=woman, test3=woman, test1=man}

List《Map《String, Object》》轉(zhuǎn)Map《String, Map《String, Object》》

由List<Map<String, Object>>轉(zhuǎn)Map<String, Map<String, Object>>操作中,Map中的String也可以是Long、Integer或者其它的類(lèi)型:

public class MainTest {
    public static void main(String[] args) {
        Map<String, Object> userMap1 = new HashMap<String, Object>(8) {{
            put("name", "test1");put("sex", "man");put("job", "worker1");
        }};
        Map<String, Object> userMap2 = new HashMap<String, Object>(8) {{
            put("name", "test2");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap3 = new HashMap<String, Object>(8) {{
            put("name", "test3");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap4 = new HashMap<String, Object>(8) {{
            put("name", "test4");put("sex", "man");put("job", "worker3");
        }};
        List<Map<String, Object>> userList = Arrays.asList(userMap1, userMap2, userMap3, userMap4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, Map<String, Object>> userMap = userList.stream()
        .collect(Collectors.toMap(map1 -> (String) map1.get("name"), map2 -> map2));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{name=test1, job=worker1, sex=man}, {name=test2, job=worker2, sex=woman}, 
{name=test3, job=worker2, sex=woman}, {name=test4, job=worker3, sex=man}]


{test4={name=test4, job=worker3, sex=man}, test2={name=test2, job=worker2, sex=woman},
test3={name=test3, job=worker2, sex=woman}, test1={name=test1, job=worker1, sex=man}}

List《Map》轉(zhuǎn)Map《String, List《Map》》

由List轉(zhuǎn)Map>,根據(jù)Map中的某個(gè)值進(jìn)行分組:

public class MainTest {
    public static void main(String[] args) {
        Map<String, Object> userMap1 = new HashMap<String, Object>(8) {{
            put("name", "test1");put("sex", "man");put("job", "worker1");
        }};
        Map<String, Object> userMap2 = new HashMap<String, Object>(8) {{
            put("name", "test2");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap3 = new HashMap<String, Object>(8) {{
            put("name", "test3");put("sex", "woman");put("job", "worker2");
        }};
        Map<String, Object> userMap4 = new HashMap<String, Object>(8) {{
            put("name", "test4");put("sex", "man");put("job", "worker3");
        }};
        List<Map<String, Object>> userList = Arrays.asList(userMap1, userMap2, userMap3, userMap4);
        System.out.println(userList);
        // 使用stream流將List轉(zhuǎn)成Map
        Map<String, List<Map<String, Object>>> userMap = userList.stream()
                .collect(Collectors.groupingBy(map1 -> (String) map1.get("sex")));
        System.out.println(userMap);
    }
}
-------------打印結(jié)果-------------
[{name=test1, job=worker1, sex=man}, {name=test2, job=worker2, sex=woman}, {name=test3, job=worker2, sex=woman}, {name=test4, job=worker3, sex=man}]
{woman=[{name=test2, job=worker2, sex=woman}, {name=test3, job=worker2, sex=woman}], man=[{name=test1, job=worker1, sex=man}, {name=test4, job=worker3, sex=man}]}

性能說(shuō)明

需要注意的是Stream使用流處理也是有使用限制的,比如初始化時(shí)間和性能限制:

  • 初始化時(shí)間:系統(tǒng)第一次使用Stream流的時(shí)候初始化時(shí)間如果是1W數(shù)據(jù)以?xún)?nèi)的需要幾十毫秒,如果是10W數(shù)據(jù)以?xún)?nèi)的初始化需要100毫秒左右,100W初始化需要1000毫秒左右,1000W初始化則需要2500毫秒左右,而foreach的初始化時(shí)間和后續(xù)的時(shí)間是差不多的;
  • 運(yùn)行性能:數(shù)據(jù)量在1W級(jí)別以下的時(shí)間花費(fèi)差不多,10W數(shù)據(jù)以?xún)?nèi)的Stream流比性能是foreach的1/2,100W數(shù)據(jù)以?xún)?nèi)的Stream流性能是foreach的3/5,而到了1000W數(shù)據(jù)量級(jí)下Stream又變成了foreach的一倍左右,foreach到了1000W數(shù)據(jù)量級(jí)下最開(kāi)始運(yùn)行時(shí)間還保持在1400毫秒左右,到了后面則跑到了6000毫秒甚至7000毫秒,不知道是不是因?yàn)镚C導(dǎo)致的。

因此使用Stream時(shí)適用于低數(shù)據(jù)量的情況,當(dāng)數(shù)據(jù)量級(jí)在1W以下是Stream流和foreach都可以使用,性能差別不大;到了10W-100W時(shí)應(yīng)該使用foreach性能更快;而到了1000W量級(jí)的情況下就該使用Stream或者其它的大數(shù)據(jù)解析框架了。

使用上述方式的20次平均運(yùn)行時(shí)間表(僅代表本機(jī)I5-8400 2.8Ghz-2.81Ghz的規(guī)格CPU運(yùn)行效率):

運(yùn)行方式

數(shù)據(jù)量級(jí)

初始化時(shí)間(ms)

初始化后的

平均運(yùn)行效率(ms)

foreach

1W

38

1

stream流

1W

1

1

foreach

10W

28

6

stream流

10W

54

12

foreach

100W

139

111

stream流

100W

1300

181

foreach

1000W

2500

3500

stream流

1000W

1130

6000

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?LockSupport常用方法的源碼分析

    Java?LockSupport常用方法的源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java?LockSupport類(lèi)中的方法和部分源碼,以及面試常問(wèn)到的一個(gè)小問(wèn)題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • 一文詳解Java中的原子操作

    一文詳解Java中的原子操作

    在Java中,原子操作尤為重要,尤其是在多線(xiàn)程環(huán)境中,想象一下,如果小黑在操作一個(gè)共享變量時(shí),這個(gè)操作被其他線(xiàn)程打斷,那會(huì)發(fā)生什么?可能會(huì)導(dǎo)致數(shù)據(jù)不一致,或者更糟糕的情況,本文將給大家詳細(xì)介紹一下Java中的原子操作
    2024-01-01
  • Java中的位運(yùn)算符、移位運(yùn)算詳細(xì)介紹

    Java中的位運(yùn)算符、移位運(yùn)算詳細(xì)介紹

    這篇文章主要介紹了Java中的位運(yùn)算符、移位運(yùn)算,有需要的朋友可以參考一下
    2013-12-12
  • Java格式化日期和時(shí)間三種方法

    Java格式化日期和時(shí)間三種方法

    這篇文章主要給大家介紹了關(guān)于Java格式化日期和時(shí)間三種方法的相關(guān)資料,最近遇到很多在Java里獲取當(dāng)前時(shí)間的問(wèn)題,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • springboot logback如何從apollo配置中心讀取變量

    springboot logback如何從apollo配置中心讀取變量

    這篇文章主要介紹了springboot logback如何從apollo配置中心讀取變量的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作

    JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作

    這篇文章主要介紹了JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java對(duì)象初始化過(guò)程代碼塊和構(gòu)造器的調(diào)用順序

    Java對(duì)象初始化過(guò)程代碼塊和構(gòu)造器的調(diào)用順序

    這篇文章主要介紹了Java對(duì)象初始化過(guò)程代碼塊和構(gòu)造器的調(diào)用順序,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • springboot使用redis實(shí)現(xiàn)從配置到實(shí)戰(zhàn)

    springboot使用redis實(shí)現(xiàn)從配置到實(shí)戰(zhàn)

    本文主要介紹了springboot使用redis ,采用的是RedisTemplate的形式,還有一種采用spring支持的注解進(jìn)行訪(fǎng)問(wèn)緩存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說(shuō)在容器加載它作用的Bean時(shí),檢查容器中是否存在目標(biāo)類(lèi)型,需要的朋友可以參考下
    2024-01-01
  • springboot2學(xué)習(xí)世界著名程序springboot開(kāi)發(fā)體驗(yàn)

    springboot2學(xué)習(xí)世界著名程序springboot開(kāi)發(fā)體驗(yàn)

    這篇文章主要為大家介紹了世界著名程序springboot開(kāi)發(fā)體驗(yàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

宜良县| 大姚县| 宿迁市| 白城市| 大兴区| 馆陶县| 诸城市| 龙州县| 美姑县| 神农架林区| 泰和县| 唐山市| 子长县| 遂宁市| 宜兰市| 子洲县| 富川| 安康市| 宜都市| 望都县| 白山市| 平阴县| 江山市| 上虞市| 柏乡县| 乃东县| 临安市| 梅州市| 密山市| 石狮市| 芦溪县| 芜湖县| 渭南市| 汾西县| 弋阳县| 电白县| 庆云县| 翁源县| 临漳县| 鄂温| 颍上县|