淺析scala中map與flatMap的區(qū)別
在函數(shù)式語言中,函數(shù)作為一等公民,可以在任何地方定義,在函數(shù)內(nèi)或函數(shù)外,可以作為函數(shù)的參數(shù)和返回值,可以對(duì)函數(shù)進(jìn)行組合。由于命令式編程語言也可以通過類似函數(shù)指針的方式來實(shí)現(xiàn)高階函數(shù),函數(shù)式的最主要的好處主要是不可變性帶來的。沒有可變的狀態(tài),函數(shù)就是引用透明(Referential transparency)的和沒有副作用(No Side Effect)。
任何一種函數(shù)式語言中,都有map函數(shù)與faltMap這兩個(gè)函數(shù),比如python雖然不是純函數(shù)式語言,也有這兩個(gè)函數(shù)。再比如在jdk1.8之后,也加入了Lambda表達(dá)式,自然也支持map函數(shù)。
現(xiàn)在簡單說說scala中這兩個(gè)函數(shù)的用法。有一種觀點(diǎn)認(rèn)為將map和flatMap說成Scala函數(shù)機(jī)制的核心都不為過分,其實(shí)是有一定道理的。因?yàn)閷?shí)際中我們使用最多的場(chǎng)景就是對(duì)數(shù)據(jù)進(jìn)行map操作或者flatMap操作。map函數(shù)的用法,顧名思義,將一個(gè)函數(shù)傳入map中,然后利用傳入的這個(gè)函數(shù),將集合中的每個(gè)元素處理,并將處理后的結(jié)果返回。而flatMap與map唯一不一樣的地方就是傳入的函數(shù)在處理完后返回值必須是List,其實(shí)這也不難理解,既然是flatMap,那除了map以外必然還有flat的操作,所以需要返回值是List才能執(zhí)行flat這一步。
總結(jié):1. map會(huì)將每一條輸入映射為一個(gè)新對(duì)象。{蘋果,梨子}.map(去皮) = {去皮蘋果,去皮梨子} 其中: “去皮”函數(shù)的類型為:A => B
2.flatMap包含兩個(gè)操作:會(huì)將每一個(gè)輸入對(duì)象輸入映射為一個(gè)新集合,然后把這些新集合連成一個(gè)大集合。 {蘋果,梨子}.flatMap(切碎) = {蘋果碎片1,蘋果碎片2,梨子碎片1,梨子碎片2} 其中: “切碎”函數(shù)的類型為: A => List<B>
廢話不多說,看一個(gè)小例子就明白用法了。
object collection_t1 { def flatMap1(): Unit = { val li = List(1,2,3) val res = li.flatMap(x => x match { case 3 => List('a','b') case _ => List(x*2) }) println(res) } def map1(): Unit = { val li = List(1,2,3) val res = li.map(x => x match { case 3 => List('a','b') case _ => x*2 }) println(res) } def main(args: Array[String]): Unit = { flatMap1() map1() } }
將代碼run起來,最后輸出為:
List(2, 4, a, b)
List(2, 4, List(a, b))
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于JDK8升級(jí)17及springboot?2.x升級(jí)3.x詳細(xì)指南
這篇文章主要介紹了關(guān)于JDK8升級(jí)17及springboot?2.x升級(jí)3.x的相關(guān)資料,還討論了JPA包路徑從javax改為jakarta,以及Spring?Boot版本升級(jí)和Redis配置調(diào)整等,需要的朋友可以參考下2025-01-01Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn)
在SpringBoot項(xiàng)目中,常常會(huì)把代碼文件放入不同的包中,本文主要介紹了SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決
這篇文章主要介紹了Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11基于Tomcat7、Java、WebSocket的服務(wù)器推送聊天室實(shí)例
HTML5 WebSocket實(shí)現(xiàn)了服務(wù)器與瀏覽器的雙向通訊,本篇文章主要介紹了基于Tomcat7、Java、WebSocket的服務(wù)器推送聊天室實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12Java關(guān)鍵字instanceof的兩種用法實(shí)例
這篇文章主要介紹了Java關(guān)鍵字instanceof的兩種用法實(shí)例,本文給出了instanceof關(guān)鍵字用于判斷一個(gè)引用類型變量所指向的對(duì)象是否是一個(gè)類(或接口、抽象類、父類)及用于數(shù)組比較,需要的朋友可以參考下2015-03-03