背景
棧長面試會經常問 Java 8 map 和 flatMap 的差別,大部分人都答不上來,會用 map 的都不多,還有一部分人甚至都不知道這兩個玩意是幹嘛用的,有的還以為我問 HashMap 和 FlatMap。。
這裡所問的 map 和 flatMap 并不是集合,它們都是 Stream 流接口中的方法,如果你沒用過,我估計在座的各位也有點暈,那麼今天棧長就給大家掃個盲,以實際案例來剖析這兩個玩意,讓你面試的時候再也不怕問了!
如圖所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yY2gzY1IDMjJmZ0UGZ4YmYhJWN0kTZ4EzMiZjNzE2Mh9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
在 Java 8 Stream(流)接口中有 8 個特别有意思的方法,其實就是分為兩大類:
map
flatMap
現在知道這兩個玩意的來路了吧?!
其中,xxToXxx 就是轉換為不同的類型的流。另外,Stream 系列我之前寫過一個專題了,這裡不再展開,不懂的關注公衆号Java技術棧,然後在公衆号 Java 教程菜單中閱讀。
map 方法的作用:
對流中的每個元素進行轉換
比如現在有一個 List<String> 集合:
private static List<String> LIST = Arrays.asList("h
我想讓每個元素後面都加上 "---":
/**
* map 轉換
* @author: 棧長
* @from: 公衆号Java技術棧
*/
private static void map() {
List<String> 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.
1)先把 List 轉換為 Stream;
2)調用 Stream.map 方法對 Stream 中的每個元素再封裝操作一遍;
3)把 Stream<Stream> 轉換為 List;
輸出結果:
=====map list=====
https://---www---.---javastack---.---cn---map list size: 6
結果符合預期。
另外,我将 Java 8知識點我也整理到了小程式,都是面試常考的,大家可以在Java面試庫小程式線上刷題。
如果 List 中的元素都是整數型:
private static List<String> NUMBERS_LIST = Arrays.asList("22", "19", "89", "90");
那麼就可以 直接使用内置的 mapToXxx 方法,這裡以 mapToLong 示範:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
LongStream mapToLong(ToLongFunction<? super T> mapper);
map 和 mapToXxx 的傳回類型是不一樣的。
本文所有完整示例源代碼已經上傳:
https://github.com/javastacks/javastackflatMap 方法的作用:
flat 是平鋪的意思,flatMap 即對流中每個元素進行平鋪後,形成多個流合在一起
比如現在有 3 個字元串數組:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
其參數是不一樣的,map 前、後的每個元素都是 R 類型,flatMap 前、後的每個元素由原來的 R 類型都變成了 Stream 類型。
再小小總結下:
map 适用于對每個元素進行簡單的轉換,flatMap 适用于對數組流進行平鋪後合并,兩個方法的應用場景不一樣。
是以,你學廢了嗎?趕緊用在項目中吧,提升自己的硬實力,讓同僚對你刮目相看!再啰嗦一句,對 Java 8 新增的知識點還不會用的可以關注公衆号:Java技術棧,在背景回複:java,Java 8+ 系列教程我都寫了一堆了。
歡迎 Star 學習,後面 Java 示例都會在這上面提供!
好了,今天的分享就到這裡了,後面棧長會分享更多好玩的 Java 技術和最新的技術資訊,關注公衆号Java技術棧第一時間推送,我也将主流 Java 面試題和參考答案都整理好了,在公衆号背景回複關鍵字 "面試" 進行刷題。
最後,覺得我的文章對你用收獲的話,動動小手,給個在看、轉發,原創不易,棧長需要你的鼓勵。