1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:Java 8 map 和 flatMap 的區(qū)別?大部分人答不上來!

        共 2048字,需瀏覽 5分鐘

         ·

        2021-11-26 21:24

        點擊關(guān)注公眾號,Java干貨及時送達(dá)

        背景

        棧長面試會經(jīng)常問 Java 8 map 和 flatMap 的區(qū)別,大部分人都答不上來,會用 map 的都不多,還有一部分人甚至都不知道這兩個玩意是干嘛用的,有的還以為我問 HashMap 和 FlatMap。。

        這里所問的 map 和 flatMap 并不是集合,它們都是 Stream 流接口中的方法,如果你沒用過,我估計在座的各位也有點暈,那么今天棧長就給大家掃個盲,以實際案例來剖析這兩個玩意,讓你面試的時候再也不怕問了!

        如圖所示:

        在 Java 8 Stream(流)接口中有 8 個特別有意思的方法,其實就是分為兩大類:

        • map
        • flatMap

        現(xiàn)在知道這兩個玩意的來路了吧?!

        其中,xxToXxx 就是轉(zhuǎn)換為不同的類型的流。另外,Stream 系列我之前寫過一個專題了,這里不再展開,不懂的關(guān)注公眾號Java技術(shù)棧,然后在公眾號 Java 教程菜單中閱讀。

        map

        map 方法的作用:

        對流中的每個元素進行轉(zhuǎn)換

        比如現(xiàn)在有一個 List 集合:

        private?static?List?LIST?=?Arrays.asList("https://",?"www",?".",?"javastack",?".",?"cn");

        我想讓每個元素后面都加上 "---":

        /**
        ?*?map?轉(zhuǎn)換
        ?*?@author:?棧長
        ?*?@from:?公眾號Java技術(shù)棧
        ?*/
        private?static?void?map()?{
        ????List?mapList?=?LIST.stream().map(e?->?e.concat("---")).collect(Collectors.toList());
        ????mapList.forEach(System.out::print);
        ????System.out.println("\nmap?list?size:?"?+?mapList.size());
        ????System.out.println();
        }

        1)先把 List 轉(zhuǎn)換為 Stream;

        2)調(diào)用 Stream.map 方法對 Stream 中的每個元素再封裝操作一遍;

        3)把 Stream 轉(zhuǎn)換為 List;

        輸出結(jié)果:

        =====map list===== https://---www---.---javastack---.---cn--- map list size: 6

        結(jié)果符合預(yù)期。

        另外,我將 Java 8知識點我也整理到了小程序,都是面試??嫉模蠹铱梢栽?a class="weapp_text_link js_weapp_entry" style="font-size:16px;" data-miniprogram-appid="wxe57fd7ba3fb24ae8" data-miniprogram-path="pages/index/list" data-miniprogram-nickname="Java面試庫" data-miniprogram-type="text" data-miniprogram-servicetype="">Java面試庫小程序在線刷題。


        如果 List 中的元素都是整數(shù)型:

        private?static?List?NUMBERS_LIST?=?Arrays.asList("22",?"19",?"89",?"90");

        那么就可以 直接使用內(nèi)置的 mapToXxx 方法,這里以 mapToLong 演示:

        /**
        ?*?mapToLong?轉(zhuǎn)換
        ?*?@author:?棧長
        ?*?@from:?公眾號Java技術(shù)棧
        ?*/
        private?static?void?mapToLong()?{
        ????System.out.println("=====map?to?long?list=====");
        ????List?longList?=?NUMBERS_LIST.stream().mapToLong(Long::valueOf).boxed().collect(Collectors.toList());
        ????longList.forEach(System.out::println);
        ????System.out.println("map?to?long?list?size:?"?+?longList.size());
        ????System.out.println();
        }

        1)先把 List 轉(zhuǎn)換為 Stream;

        2)調(diào)用 Stream.mapToLong 方法把流轉(zhuǎn)換為 LongStream 類型;

        3)調(diào)用 LongStream.boxed 方法收集為 Stream 類型;

        4)把 Stream 轉(zhuǎn)換為 List;

        輸出結(jié)果:

        =====map to long list===== 22 19 89 90 map to long list size: 4

        當(dāng)然這個使用 map 也能實現(xiàn),但使用 mapToXxx 可以將原始流(Stream)轉(zhuǎn)換為 XxxStream:

        XxxStream 可以有更多基于整數(shù)型的功能,比如快速對元素進行匯總(sum)、求最大數(shù)(max)、最小數(shù)(min)等等,如果要涉及到元素計算,使用 mapToXxx 會更香。

        如源碼所示:

        ?Stream?map(Function?mapper);
        LongStream?mapToLong(ToLongFunction?mapper);

        map 和 mapToXxx 的返回類型是不一樣的。

        本文所有完整示例源代碼已經(jīng)上傳:

        https://github.com/javastacks/javastack

        flatMap

        flatMap 方法的作用:

        flat 是平鋪的意思,flatMap 即對流中每個元素進行平鋪后,形成多個流合在一起

        比如現(xiàn)在有 3 個字符串?dāng)?shù)組:

        String[]?arr1?=?{"https://",?"www",?".",?"javastack",?".",?"cn"};
        String[]?arr2?=?{"公眾號",?":",?"Java技術(shù)棧"};
        String[]?arr3?=?{"作者",?":",?"棧長"};

        現(xiàn)在直接轉(zhuǎn)換為 Stream:

        System.out.println("=====arrays?list=====");
        List?list?=?Stream.of(arr1,?arr2,?arr3).collect(Collectors.toList());
        list.forEach(System.out::print);
        System.out.println("\narrays?list?size:?"?+?list.size());
        System.out.println();

        結(jié)果輸出:

        =====arrays list===== [Ljava.lang.String;@21b8d17c[Ljava.lang.String;@6433a2[Ljava.lang.String;@5910e440 arrays list size: 3

        沒錯,是 3 個數(shù)組元素。

        再來看使用 flatMap 方法的效果:

        System.out.println("=====flatmap?list=====");
        List?mapList?=?list.stream().flatMap(Arrays::stream).collect(Collectors.toList());
        mapList.forEach(System.out::print);
        System.out.println("\nflatmap?list?size:?"?+?mapList.size());
        System.out.println();

        結(jié)果輸出:

        =====flatmap list===== https://www.javastack.cn公眾號:Java技術(shù)棧作者:棧長 flatmap list size: 12

        元素大小變成了 12,把 3 個數(shù)組流中的元素全部平鋪合到一個流中了,然后流中總共為 12 個元素。

        這里我用的數(shù)組類型,如果是多個 List 類型也是可以的,其底層也是數(shù)組,只要能將元素轉(zhuǎn)換成流都是可以的。

        總結(jié)

        map 是對流元素進行轉(zhuǎn)換,flatMap 是對流中的元素(數(shù)組)進行平鋪后合并,即對流中的每個元素平鋪后又轉(zhuǎn)換成為了 Stream 流。

        來看下兩個方法的源碼:

        ?Stream?map(Function?mapper);
        ?Stream?flatMap(Function>?mapper);

        其參數(shù)是不一樣的,map 前、后的每個元素都是 R 類型,flatMap 前、后的每個元素由原來的 R 類型都變成了 Stream 類型。

        再小小總結(jié)下:

        map 適用于對每個元素進行簡單的轉(zhuǎn)換,flatMap 適用于對數(shù)組流進行平鋪后合并,兩個方法的應(yīng)用場景不一樣。

        所以,你學(xué)廢了嗎?趕緊用在項目中吧,提升自己的硬實力,讓同事對你刮目相看!再啰嗦一句,對 Java 8 新增的知識點還不會用的可以關(guān)注公眾號:Java技術(shù)棧,在后臺回復(fù):java,Java 8+ 系列教程我都寫了一堆了。

        本文所有完整示例源代碼已經(jīng)上傳:

        https://github.com/javastacks/javastack

        歡迎 Star 學(xué)習(xí),后面 Java 示例都會在這上面提供!

        好了,今天的分享就到這里了,后面棧長會分享更多好玩的 Java 技術(shù)和最新的技術(shù)資訊,關(guān)注公眾號Java技術(shù)棧第一時間推送,我也將主流 Java 面試題和參考答案都整理好了,在公眾號后臺回復(fù)關(guān)鍵字 "面試" 進行刷題。

        最后,覺得我的文章對你用收獲的話,動動小手,給個在看、轉(zhuǎn)發(fā),原創(chuàng)不易,棧長需要你的鼓勵。

        版權(quán)聲明: 本文系公眾號 "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實屬不易,轉(zhuǎn)載、引用本文內(nèi)容請注明出處,抄襲者一律舉報+投訴,并保留追究其法律責(zé)任的權(quán)利。





        關(guān)注Java技術(shù)棧看更多干貨



        獲取 Spring Boot 實戰(zhàn)筆記!
        瀏覽 70
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            同桌让我腿扒开摸到高潮 | 97人人操人人操 | 国产成人精品免费视频大全APP | 甘雨被狂揉下部羞羞漫画 | 国产一级片在线播放 | 亚洲国产成人视频 | 久久伊人777777 | 国产精品无套久久久久 | 日日碰狠狠躁久久躁蜜桃 | 午夜成人免费视频网站 |