3 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
雙方map
并flatMap
可以應(yīng)用到Stream<T>
他們都返回Stream<R>
。不同之處在于map
操作為每個(gè)輸入值生成一個(gè)輸出值,而flatMap
操作為每個(gè)輸入值生成任意數(shù)量(零個(gè)或多個(gè))值。
這反映在每個(gè)操作的參數(shù)中。
該map
操作采用a Function
,為輸入流中的每個(gè)值調(diào)用,并生成一個(gè)結(jié)果值,該值將發(fā)送到輸出流。
該flatMap
操作采用概念上想要消耗一個(gè)值并產(chǎn)生任意數(shù)量的值的函數(shù)。但是,在Java中,返回任意數(shù)量的值的方法很麻煩,因?yàn)榉椒ㄖ荒芊祷亓慊蛞粋€(gè)值??梢韵胂笠粋€(gè)API,其中mapper函數(shù)flatMap
獲取值并返回?cái)?shù)組或aList
值,然后發(fā)送到輸出。鑒于這是流庫(kù),一種表示任意數(shù)量的返回值的特別方法是mapper函數(shù)本身返回一個(gè)流!映射器返回的流中的值將從流中排出并傳遞到輸出流。每次調(diào)用mapper函數(shù)返回的值的“叢”在輸出流中根本不被區(qū)分,因此輸出被稱為“扁平化”。
典型用途是用于映射函數(shù)的flatMap
返回Stream.empty()
,如果要發(fā)送零個(gè)值,或者類似的東西Stream.of(a, b, c)
,如果要返回幾個(gè)值。但是當(dāng)然可以返回任何流。

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
Stream.flatMap
,因?yàn)樗拿挚梢圆碌剑且粋€(gè)map
和一個(gè)flat
操作的組合。這意味著您首先將一個(gè)函數(shù)應(yīng)用于元素,然后將其展平。Stream.map
僅在不對(duì)流進(jìn)行展平的情況下將函數(shù)應(yīng)用于流。
要了解流的扁平化,請(qǐng)考慮[ [1,2,3],[4,5,6],[7,8,9] ]
具有“兩個(gè)級(jí)別”的結(jié)構(gòu)。扁平化這意味著將其轉(zhuǎn)換為“一級(jí)”結(jié)構(gòu):[ 1,2,3,4,5,6,7,8,9 ]
。
添加回答
舉報(bào)