<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2037字,需瀏覽 5分鐘

           ·

          2022-01-09 11:59

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

          來自公眾號:Java技術(shù)棧

          背景

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

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

          如圖所示:

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

          • map
          • flatMap

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

          其中,xxToXxx 就是轉(zhuǎn)換為不同的類型的流。

          map

          map 方法的作用:

          對流中的每個元素進(jìn)行轉(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知識點我也整理到了小程序,都是面試??嫉?,大家可以在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ù)型的功能,比如快速對元素進(jìn)行匯總(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 即對流中每個元素進(jìn)行平鋪后,形成多個流合在一起

          比如現(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 是對流元素進(jìn)行轉(zhuǎn)換,flatMap 是對流中的元素(數(shù)組)進(jìn)行平鋪后合并,即對流中的每個元素平鋪后又轉(zhuǎn)換成為了 Stream 流。

          來看下兩個方法的源碼:

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

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

          再小小總結(jié)下:

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

          所以,你學(xué)廢了嗎?趕緊用在項目中吧,提升自己的硬實力,讓同事對你刮目相看!

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

          https://github.com/javastacks/javastack

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


          1、致歉!抖音Semi Design承認(rèn)參考阿里Ant Design

          2、對比7種分布式事務(wù)方案,還是偏愛阿里開源的Seata,真香!

          3、Redis存儲結(jié)構(gòu)體信息,選hash還是string?

          4、掃盲 docker 常用命令

          5、最全分布式Session解決方案

          6、21 款 yyds 的 IDEA插件

          7、真香!用 IDEA 神器看源碼,效率真高!

          點分享

          點收藏

          點點贊

          點在看

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩国产在线播放 | 中文字幕亚洲欧美日韩高 | 91av免费 | 国产精品一区二区性色AV | 来一个美国大鸡巴操逼 |