scala 匿名函數(shù)案例詳解
1.匿名函數(shù)含義
@1.說(shuō)明
沒(méi)有名字的函數(shù)就是匿名函數(shù)。
(x:Int)=>{函數(shù)體}
x:表示輸入?yún)?shù)類(lèi)型;Int:表示輸入?yún)?shù)類(lèi)型;函數(shù)體:表示具體代碼邏輯
1.1傳遞匿名函數(shù)含義
@2.傳遞匿名函數(shù)至簡(jiǎn)原則:
(1)參數(shù)的類(lèi)型可以省略,會(huì)根據(jù)形參進(jìn)行自動(dòng)的推導(dǎo)
(2)類(lèi)型省略之后,發(fā)現(xiàn)只有一個(gè)參數(shù),則圓括號(hào)可以省略;其他情
況:沒(méi)有參數(shù)和參數(shù)超過(guò) 1 的永遠(yuǎn)不能省略圓括號(hào)。
(3)匿名函數(shù)如果只有一行,則大括號(hào)也可以省略
(4)如果參數(shù)只出現(xiàn)一次,則參數(shù)省略且后面參數(shù)可以用_代替
1.2傳遞匿名函數(shù)第一層代碼解析
小編在此將代碼分為:“第一層”和“第二層”,方便大家理解:
和匿名函數(shù)的相愛(ài)相殺, 各位看官,正片開(kāi)始。
-slaca第一層
//需求:傳遞的函數(shù)有兩個(gè)參數(shù) //函數(shù)含義:傳遞兩個(gè)數(shù),并對(duì)兩個(gè)數(shù)進(jìn)行相加的邏輯操作 def calculator(a: Int, b: Int, sum: (Int, Int) => Int): Int = { sum(a, b) }
【函數(shù)具體解析】——小編提示:一定要先看懂3.2再看后面
@3.1 首先定義一個(gè)函數(shù):參數(shù)包含 “數(shù)據(jù)” 和 “邏輯函數(shù)”
@3.2 第一層的時(shí)候 只需要聲名《“數(shù)據(jù)”的類(lèi)型》 或《 “邏輯函數(shù)”的參數(shù)
類(lèi)型和返回值類(lèi)型,
1.(a: Int, b: Int) ------------------->數(shù)據(jù)的類(lèi)型
2.(sum: (Int, Int) => Int)--------->邏輯函數(shù)的參數(shù)類(lèi)型和返回值類(lèi)型
3.sum(a, b):比較復(fù)雜,喝口水再來(lái)看,乖!但是記?。菏撬皇强谒?!
3.1:首先 “傳遞匿名函數(shù)”中的 邏輯是對(duì)數(shù)據(jù)的操作
3.2:那么可以理解為“傳遞匿名函數(shù)” 的數(shù)據(jù)就是為邏輯準(zhǔn)備的
3.3 :所以邏輯函數(shù)就得包含數(shù)據(jù),就有了(x:Int)=>{函數(shù)體} 中函數(shù)體包
含sum(a, b),這樣才能進(jìn)行 對(duì)數(shù)據(jù)的邏輯操作
退一萬(wàn)步來(lái)講,邏輯跟尼瑪數(shù)據(jù)分開(kāi),還操作個(gè)錘子
所以sum(a, b) ->第一層的最后操作:邏輯與數(shù)據(jù)的結(jié)合(跟那愛(ài)情一樣是
吧。聽(tīng)懂掌聲,為愛(ài)鼓掌)就在這完成了。
@3.3 第二層的時(shí)候 才傳遞 《數(shù)據(jù)----->真實(shí)的數(shù)據(jù)》 《邏輯函數(shù)----->真
正的邏輯》
3.1 這其實(shí)跟 “java”特別像
小編也在此將代碼分為:“第一層”和“第二層”,方便大家理解:
@4.1 Java第一層
Java是先聲明一個(gè)方法:也以傳遞兩個(gè)數(shù)字,并進(jìn)行相加 為例
public static int add(int a,int b){ return a+b; }
1(int:a,int:b)----> 參數(shù)
2 a+b---->方法體 :此處也是省了類(lèi)型,因?yàn)閰?shù)已經(jīng)聲明過(guò)了
@4.2java第二層
等到調(diào)用時(shí),才傳遞數(shù)據(jù)
add(2,3);
1.add(1,2) —> 此處省了邏輯,因?yàn)榉椒w中聲明過(guò)
2.想必看到這兒,大家已經(jīng)有了心中的小九九,接下來(lái)大家跟小編一起看
看最后的思路吧
3.2傳遞匿名函數(shù)第二層代碼解析
// (1)標(biāo)準(zhǔn)函數(shù)調(diào)用 println(calculator(2, 3, (x: Int, y: Int) => {x + y})) // (2)如果只有一行,則大括號(hào)也可以省略 println(calculator(2, 3, (x: Int, y: Int) => x + y)) // (3)參數(shù)的類(lèi)型可以省略,會(huì)根據(jù)形參進(jìn)行自動(dòng)的推導(dǎo); println(calculator(2, 3, (x , y) => x + y)) // (4)如果參數(shù)只出現(xiàn)一次,則參數(shù)省略且后面參數(shù)可以用_代替 println(calculator(2, 3, _ + _))
想必看到這兒,各位看官的思緒就像…那句話(huà)咋說(shuō)來(lái)著,忘求了。讓我百度下下
瑪?shù)?,搜了半天沒(méi)搜到,略過(guò)…略過(guò)…
小編提示:沒(méi)有思緒的可以在看兩遍,琢磨琢磨!??!
正片開(kāi)始:不是蒼老師哦!
scala第二層:
1.數(shù)據(jù)---->真正的數(shù)據(jù)
2.邏輯---->真正的邏輯
3.第一層的 sum(a, b)已經(jīng)完成了邏輯包含數(shù)據(jù)的操作,當(dāng)?shù)诙觽鬟f完數(shù)
據(jù),這部分就真正的完成了。剩下的就是看邏輯怎么對(duì)數(shù)據(jù)進(jìn)行操作
3.1 x: Int, y: Int) => x + y ---->(x , y) => x + y 省類(lèi)型:會(huì)根據(jù)形參進(jìn)行自動(dòng)的推導(dǎo)。沒(méi)什么獨(dú)特的,java也是一樣的:(參數(shù)有類(lèi)型,方法體中省了的)
3.2 a: Int, b: Int—>2, 3 結(jié)合Scala 一二層的參數(shù)看
int a,int b-------->2,3 結(jié)合Java 一二層的參數(shù)看
從這兒我們可以看出 只要知道參數(shù)的名,和類(lèi)型 即可 直接給值
3.3 (Int, Int) => Int----->_ + _ 單從這兒和3.2可以理解為 把參數(shù)名寫(xiě)為"_"可能是scala的一個(gè)特色嘛,因?yàn)閺?.2得知 需要參數(shù)名和類(lèi)型,才能直接給值嘛。
3.4 但是我們?cè)?第一層的函數(shù)塊中寫(xiě)的是 sum(a,b)這里省了類(lèi)型,因?yàn)榭梢詮膮?shù)a: Int, b: Int得到參數(shù)名的類(lèi)型,所以我們的"+"是基于 sum(a,b) 做的推斷,此時(shí)參數(shù)名,參數(shù)類(lèi)型都有了,就可以直接傳值了,但是說(shuō)白了,這個(gè)參數(shù)名是固定的,再怎么給值,也不能變。所以scala為了簡(jiǎn)寫(xiě),就用“_”代替了
以上文章僅小編個(gè)人見(jiàn)解,如有錯(cuò)誤,請(qǐng)大家暢所欲言。請(qǐng)各位dai佬諒解
<小編也只學(xué)了十來(lái)天scala,所以有很多不足的地方,請(qǐng)指出,謝謝大家了
同時(shí)小編寫(xiě)的不易,從八點(diǎn)開(kāi)始寫(xiě),寫(xiě)道12點(diǎn),中間吃了個(gè)飯。也請(qǐng)大家
補(bǔ)充:scala匿名函數(shù)案例
匿名函數(shù)
Scala提供了一個(gè)相對(duì)輕量級(jí)的語(yǔ)法來(lái)定義匿名函數(shù)。源代碼中的匿名函數(shù)稱(chēng)為函數(shù)文字,在運(yùn)行時(shí),函數(shù)文字被實(shí)例化為稱(chēng)為函數(shù)值的對(duì)象。Scala支持一級(jí)函數(shù),函數(shù)可以用函數(shù)文字語(yǔ)法表達(dá),即(x:Int)=> x + 1,該函數(shù)可以由一個(gè)叫作函數(shù)值的對(duì)象來(lái)表示。
基本介紹
沒(méi)有名字的函數(shù)就是匿名函數(shù),可以通過(guò)函數(shù)表達(dá)式 來(lái)設(shè)置匿名函數(shù)。
匿名函數(shù)(也稱(chēng)為 lambda)是作為參數(shù)傳遞給高階函數(shù)的代碼塊。 維基百科將 匿名函數(shù) 定義為“未綁定到標(biāo)識(shí)符的函數(shù)定義”。
應(yīng)用實(shí)例
Scala 中定義匿名函數(shù)的語(yǔ)法很簡(jiǎn)單,箭頭左邊是參數(shù)列表,右邊是函數(shù)體。
使用匿名函數(shù)后,我們的代碼變得更簡(jiǎn)潔了。
下面的表達(dá)式就定義了一個(gè)接受一個(gè) Double 類(lèi)型輸入?yún)?shù)的匿名函數(shù):
val triple = (x:Double) => 3*x println(triple(3))
說(shuō)明:
- (x:Double) => 3 * x 就是匿名函數(shù)
- (x:Double) 是形參列表,=> 是規(guī)定語(yǔ)法表示后面是函數(shù)體,3 * x 就是函數(shù)體,如果有多行,可以 {} 換行寫(xiě)。
- triple 是指向匿名函數(shù)的變量。
一旦你熟悉了 Scala,你就會(huì)一直使用這種形式來(lái)編寫(xiě)匿名函數(shù),這些函數(shù)在函數(shù)的一個(gè)位置使用一個(gè)變量。 但如果你愿意,你也可以用更長(zhǎng)的形式來(lái)寫(xiě)它們
val doubledInts = ints.map((i: Int) => i * 2)
因?yàn)?Scala 編譯器可以從 ints 中的數(shù)據(jù)推斷 i 是一個(gè) Int,所以可以刪除 Int 聲明:
val doubledInts = ints.map((i) => i * 2)
因?yàn)橹挥幸粋€(gè)參數(shù),所以不需要在參數(shù) i 周?chē)睦ㄌ?hào):
val doubledInts = ints.map(i => i * 2)
因?yàn)楫?dāng)參數(shù)在函數(shù)中只出現(xiàn)一次時(shí),Scala 允許您使用 _ 符號(hào)而不是變量名,所以代碼可以進(jìn)一步簡(jiǎn)化:
val doubledInts = ints.map(_ * 2)
案例
請(qǐng)編寫(xiě)一個(gè)匿名函數(shù),可以返回2個(gè)整數(shù)的和,并輸出該匿名函數(shù)的類(lèi)型。
val f1 = (n1: Int, n2: Int ) => { println("匿名函數(shù)被調(diào)用") n1 + n2 } println("f1類(lèi)型=" + f1) println(f1(10, 30))
到此這篇關(guān)于scala 匿名函數(shù)詳解的文章就介紹到這了,更多相關(guān)scala 匿名函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例
這篇文章主要介紹了Java Swing JPasswordField密碼框的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java連接postgresql數(shù)據(jù)庫(kù)的示例代碼
本篇文章主要介紹了Java連接postgresql數(shù)據(jù)庫(kù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例
這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實(shí)踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對(duì)象,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10SpringBoot?2.7.18?集成?Mybatis?Plus?+?Druid的實(shí)例詳解
Mybatis和MybatisPlus都是流行的持久層框架,MybatisPlus在Mybatis基礎(chǔ)上增加了更多便捷的功能,如自動(dòng)CRUD、分頁(yè)插件等,文章還提到了Entity、Mapper、Service、Controller等組件的基本使用方法,為開(kāi)發(fā)者提供了一套完整的集成方案2024-10-10Spring boot中PropertySource注解的使用方法詳解
這篇文章主要給大家介紹了關(guān)于Spring boot中PropertySource注解的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Java中的HashMap內(nèi)存泄漏問(wèn)題詳解
這篇文章主要介紹了Java中的HashMap內(nèi)存泄漏問(wèn)題詳解,WeakHashMap中的key是弱引用,如果再使用之后沒(méi)有及時(shí)remove掉這個(gè)key,那么當(dāng)GC時(shí)key就可能會(huì)被回收,導(dǎo)致key對(duì)應(yīng)的value對(duì)象占用的內(nèi)存無(wú)法回收進(jìn)而導(dǎo)致內(nèi)存泄漏,需要的朋友可以參考下2023-09-09Java實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)的三種方法
在Java中實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)的方法,通常我們會(huì)使用java.util.Random類(lèi)來(lái)生成隨機(jī)數(shù),然后基于這些隨機(jī)數(shù)來(lái)選擇中獎(jiǎng)?wù)?以下將給出幾種常見(jiàn)的隨機(jī)抽獎(jiǎng)實(shí)現(xiàn)方式,需要的朋友可以參考下2024-09-09Java精品項(xiàng)目瑞吉外賣(mài)之登陸的完善與退出功能篇
這篇文章主要為大家詳細(xì)介紹了java精品項(xiàng)目-瑞吉外賣(mài)訂餐系統(tǒng),此項(xiàng)目過(guò)大,分為多章獨(dú)立講解,本篇內(nèi)容為新增菜品和分頁(yè)查詢(xún)功能的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05