stream map方法_Java Stream中map和flatMap方法
最近看到一篇講stream語法的文章,學習Java中map()和flatMap()方法之間的區別。
雖然看起來這兩種方法都做同樣的事情,都是做的映射操作,但實際上差之毫厘謬以千里。
通過演示Demo中的代碼可以了解map()和flatMap()的具體功能差異。
- 首先來一段簡單的
stream語法foreach方法的用法
演示Demo:
????????List?funs?=?Arrays.asList("F",?"U",?"N");
????????funs.stream().forEach(x?->?output(x));控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
F
U
N
Process?finished?with?exit?code?0
map方法
map()是一個中間操作,這意味著它返回Stream對象。
- 先來一個簡單
演示Demo:
????????List?funs?=?Arrays.asList("F",?"U",?"N");
????????funs.stream().map(x->x+"001").forEach(x->output(x));控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
INFO->?f
INFO->?u
INFO->?n
INFO->?F001
INFO->?U001
INFO->?N001
java.util.stream.ReferencePipeline$3@27ae2fd0
java.util.stream.ReferencePipeline$3@29176cc1
Process?finished?with?exit?code?0
- 再來一個復雜的
演示Demo:
????????List?fun1?=?Arrays.asList("one",?"two",?"three");
????????List?fun2?=?Arrays.asList("four",?"five",?"six");
????????List>?nestedList?=?Arrays.asList(fun1,?fun2);
????????nestedList.stream().map(x?->?{return?x.stream().map(a?->?a.toUpperCase());
????????}).forEach(x?->?output(x));控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
INFO->?java.util.stream.ReferencePipeline$3@45018215
INFO->?java.util.stream.ReferencePipeline$3@30b7c004
顯然,在最后一步輸出的時候,x是一個stream的對象,而不是一個list對象。
當我們嘗試從List>獲取值進行操作時,map()無法如預期一樣工作,需要進行修改才能從嵌套的List>對象獲取字符串值。
如下:
????????List?fun1?=?Arrays.asList("one",?"two",?"three");
????????List?fun2?=?Arrays.asList("four",?"five",?"six");
????????List>?nestedList?=?Arrays.asList(fun1,?fun2);
????????nestedList.stream().map(x?->?{return?x.stream().map(a?->?a.toUpperCase());
????????}).forEach(x?->x.forEach(a->output(a)));控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
INFO->?ONE
INFO->?TWO
INFO->?THREE
INFO->?FOUR
INFO->?FIVE
INFO->?SIX
Process?finished?with?exit?code?0
flatMap方法
讓我們在上述代碼中將map()更改為flatMap(),然后查看輸出。
- 先來一個簡單
演示Demo:
????????List?fun1?=?Arrays.asList("one",?"two",?"three");
????????List?fun2?=?Arrays.asList("four",?"five",?"six");
????????List>?nestedList?=?Arrays.asList(fun1,?fun2);
????????nestedList.stream().flatMap(x?->?x.stream()).map(x->x.toUpperCase()).forEach(x?->?output(x));控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
INFO->?ONE
INFO->?TWO
INFO->?THREE
INFO->?FOUR
INFO->?FIVE
INFO->?SIX
Process?finished?with?exit?code?0
相當于在.flatMap(x -> x.stream())這個時候我們把x.stream()返回的stream對象合并成了一個新的stream對象。這一點在Stream類的方法注釋中找到了印證。
??/**
??·····
?????*?@return?the?new?stream
?????*/
?????Stream?flatMap(Function?super?T,???extends?Stream?extends?R>>?mapper);Java 8 map()與flatMap()
map()和flatMap()方法都可以應用于Stream和Optional對象。并且都返回Stream或Optional 對象。區別在于map()操作為每個輸入值生成一個輸出值,而flatMap()操作為每個輸入值生成任意數量(零個或多個)的輸出值。
在flatMap()中,每個輸入始終是一個集合,可以是List或Set或Map。
map()操作采用一個方法,該方法針對輸入流中的每個值調用,并生成一個結果值,該結果值返回至stream。
flatMap()操作采用的功能在概念上消耗一個集合對象并產生任意數量的值。但是在Java中方法返回任意數目的值很麻煩,因為方法只能返回void或一個對象。
演示Demo:
????????List?fun1?=?Arrays.asList("one",?"two",?"three");
????????List?fun2?=?Arrays.asList("four",?"five",?"six");
????????Stream.of(fun1,fun2).flatMap(List::stream).forEach(Output::output);控制臺輸出:
INFO->?當前用戶:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.7
INFO->?one
INFO->?two
INFO->?three
INFO->?four
INFO->?five
INFO->?six
Process?finished?with?exit?code?0
公眾號FunTester首發,原創分享愛好者,騰訊云和掘金社區首頁推薦,知乎七級原創作者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester熱文精選
- 寫給所有人的編程思維
- 2020年Tester自我提升
- 未來的神器fiddler Everywhere
- 測試開發工程師工作技巧
- Selenium4 IDE,它終于來了
- 自動化測試靈魂三問:是什么、為什么和做什么
- 為什么測試覆蓋率如此重要
- 吐個槽,非測勿入。
- 自動化測試框架
- 敏捷中的端到端測試
總結
以上是生活随笔為你收集整理的stream map方法_Java Stream中map和flatMap方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的陪伴是哪首歌啊?
- 下一篇: 上传图片被防火墙拦截_Web安全:文件上