Scala方法與函數(shù)使用和定義詳解
一、方法的定義
1.方法體中最后返回值可以使用return, 如果使用了return, 那么方法體的返回值類(lèi)型一定要指定
2.如果方法體重沒(méi)有return, 默認(rèn)將 方法體中最后一行計(jì)算的結(jié)果當(dāng)作返回值返回. 方法體的返回值可以省略, 會(huì)自動(dòng)推斷
3.定義方法傳入的參數(shù)一定要指定類(lèi)型
4.方法的方法體如果只有一行, 那么方法體的“{…}”可以省略
5.如果定義方法時(shí), 省略了方法名稱(chēng)和方法體之間的"=", 那么無(wú)論方法體最后一行計(jì)算的結(jié)果是什么, 都會(huì)被丟棄, 返回Unit
def max(a: Int, b: Int) = { if (a > b) { "哈哈" } else { b } } // 語(yǔ)法糖: 方法定義 def max0(a: Int, b: Int) = if (a > b) a else b
注:記住def定義的格式,按著格式敲即可,不要糾結(jié)
二、遞歸方法
遞歸方法必須要顯示指定返回體的類(lèi)型
def fun2(num: Int): Int = { if (num == 1) num else num * fun2(num - 1) } // 語(yǔ)法糖 def fun2(num:Int) : Int = if (num == 1) num else num * fun2(num - 1)
注:編譯器無(wú)法直接推斷出你最終遞歸的結(jié)果類(lèi)型,所以需要你顯示指定
三、參數(shù)有默認(rèn)值的方法
1.默認(rèn)值的函數(shù)中,如果傳入的參數(shù)個(gè)數(shù)與函數(shù)定義相同,則傳入的數(shù)值會(huì)覆蓋默認(rèn)值
2.如果不想覆蓋默認(rèn)值,傳入的參數(shù)個(gè)數(shù)小于定義的函數(shù)的參數(shù),則需要指定參數(shù)名稱(chēng)
def fun3(a: Int = 10, b: Int) = { println(a + b) }
四、可變參數(shù)個(gè)數(shù)的函數(shù)
多個(gè)參數(shù)之間逗號(hào)分開(kāi)
def fun4(elements: Int*) = { println(elements) elements.foreach(i => println(i)) // 當(dāng)匿名函數(shù)的元素只用到一次的時(shí)候, 可以用_簡(jiǎn)寫(xiě) elements.foreach(println(_)) // 當(dāng)方法入?yún)閱蝹€(gè)參數(shù)時(shí)且正好是匿名函數(shù)的元素時(shí), 進(jìn)一步簡(jiǎn)寫(xiě) elements.foreach(println) var sum = 0; for (elem <- elements) { sum += elem } sum }
五、匿名函數(shù)
注意函數(shù)的寫(xiě)法與方法的寫(xiě)法有些許的不同,出現(xiàn) => 符號(hào)就認(rèn)為是函數(shù),但實(shí)際使用上效果并無(wú)不同,僅僅是語(yǔ)法上的細(xì)微區(qū)別
原生的匿名函數(shù)寫(xiě)法(基本不用):(Int, Int) => Int就是他的類(lèi)型
/** * 原生的匿名函數(shù)寫(xiě)法(基本不用) * @return */ def fun: (Int, Int) => Int = (a: Int, b: Int) => { a + b }
常用的匿名函數(shù)寫(xiě)法: 可以將匿名函數(shù)返回給定義的一個(gè)變量, 看到“=>”就是匿名函數(shù), 多用于方法的參數(shù)是函數(shù)時(shí)(函數(shù)指針),用匿名函數(shù)簡(jiǎn)寫(xiě)
/** * 常用的匿名函數(shù)寫(xiě)法: 可以將匿名函數(shù)返回給定義的一個(gè)變量, 看到“=>”就是匿名函數(shù) * 多用于方法的參數(shù)是函數(shù)時(shí)(函數(shù)指針),用匿名函數(shù)簡(jiǎn)寫(xiě) * * @param args */ def main(args: Array[String]): Unit = { /** * 有參數(shù)匿名函數(shù) */ val value1: (Int) => Unit = (a: Int) => { println(a) } value1(1) /** * 無(wú)參數(shù)匿名函數(shù) */ val value2 = () => { println("我愛(ài)學(xué)習(xí)") } value2() /** * 有返回值的匿名函數(shù) */ val value3 = (a: Int, b: Int) => { a + b } println(value3(4, 4)) }
六、嵌套方法
/** * 嵌套方法 * 例如:嵌套方法求5的階乘 */ def fun5(num: Int) = { def fun6(a: Int, b: Int): Int = { if (a == 1) { b } else { fun6(a - 1, a * b) } } fun6(num, 1) }
七、偏應(yīng)用函數(shù)(部分應(yīng)用函數(shù))
某些情況下, 方法中參數(shù)非常多, 調(diào)用這個(gè)方法非常頻繁, 每次調(diào)用只有固定的某個(gè)參數(shù)變化, 其他都不變, 可以定義偏應(yīng)用來(lái)實(shí)現(xiàn)
def showLog(date :Date, log :String)= { println(s"date is $date, log is $log") } def main(args: Array[String]): Unit = { val date = DateUtil.date(new Date()) showLog(date,"當(dāng)前時(shí)間") // 想要調(diào)用log, 以上變化的是第二個(gè)參數(shù), 可以用偏應(yīng)用函數(shù)處理 // 把showLog()方法定義為偏應(yīng)用函數(shù) val logWithDate = showLog(date,_:String) // 第二種函數(shù)寫(xiě)法 def logWithDate2 = showLog(date,_:String) logWithDate("偏應(yīng)用函數(shù)-log11") logWithDate("偏應(yīng)用函數(shù)-log22") logWithDate("偏應(yīng)用函數(shù)-log33") }
八、高階函數(shù)
函數(shù)的參數(shù)是函數(shù),或者函數(shù)的返回類(lèi)型是函數(shù),或者函數(shù)的參數(shù)和函數(shù)的返回類(lèi)型是函數(shù)的函數(shù).
/** * 普通的方法 * * @param a * @param b * @return */ def fun(a: Int, b: Int): Int = { a + b } /** * 使用 _把方法強(qiáng)轉(zhuǎn)為一個(gè)函數(shù) */ private val function: (Int, Int) => Int = fun _ /** * 函數(shù)的參數(shù)是函數(shù): 函數(shù)的類(lèi)型 (Int, Int) => Int, 記住: 方法的引用僅為方法本身,需要重新賦實(shí)參 * * @param f 函數(shù)作為參數(shù) * @param a * @return */ def fun1(f: (Int, Int) => Int, a: Int): Int = { f(a, 100) } /** * 函數(shù)的返回是函數(shù): 必須要顯示地寫(xiě)出返回值類(lèi)型, 或者使用 f2 _ * * @param a * @param b * @return */ def fun2(a: Int, b: Int): (Int, Int) => Int = { // 在內(nèi)部定義了一個(gè)方法 def f2(v1: Int, v2: Int): Int = { v1 + v2 + a + b } f2 } /** * 函數(shù)的參數(shù)是函數(shù),函數(shù)的返回是函數(shù) * * @param f * @return */ def fum3(f: (Int, Int) => Int): (String, String) => String = { val i = f(1, 2) def fun1(s1: String, s2: String): String = { s1 + "@" + s2 + "$" + i } fun1 } /** * 函數(shù)入口 * * @param args */ def main(args: Array[String]): Unit = { // 顯示聲明過(guò)的函數(shù)作為參數(shù) println("顯示聲明過(guò)的函數(shù)作為參數(shù): " + fun1(fun, 100)) // 匿名函數(shù)作為參數(shù): 匿名函數(shù)入?yún)⒌念?lèi)型可以省略不寫(xiě) println("匿名函數(shù)作為參數(shù): " + fun1((a: Int, b: Int) => { a * b }, 100)) // 返回值是一個(gè)函數(shù) println("返回值是一個(gè)函數(shù): " + fun2(1, 2)(3, 4)) // 入?yún)⒑统鰠⒍际呛瘮?shù) println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3(fun)("hello", "scala!")) println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3((a, b) => a * b)("hello", "scala!")) }
筆者注:高階函數(shù)這塊內(nèi)容會(huì)相對(duì)較為難以理解,可以先記住這種結(jié)構(gòu)
九、柯里化函數(shù)
柯里化函數(shù): 本質(zhì)上就是對(duì)返回值是函數(shù)的方法的一種簡(jiǎn)化寫(xiě)法
def fun7(a: Int, b: Int)(c: Int, d: Int) = { a + b + c + d } /** * 函數(shù)入口 * * @param args */ def main(args: Array[String]): Unit = { println(fun7(1, 2)(3, 4)) }
注:fun7(1, 2)(3, 4)可以理解成先運(yùn)算fun7(1,2)返回了一個(gè)fun7函數(shù)對(duì)象,再對(duì)他進(jìn)行參數(shù)(3,4)的賦值
到此這篇關(guān)于Scala方法與函數(shù)使用和定義詳解的文章就介紹到這了,更多相關(guān)Scala方法與函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java字符轉(zhuǎn)碼之UTF-8互轉(zhuǎn)GBK具體實(shí)現(xiàn)
在Java程序中字符串默認(rèn)的編碼方式是UTF-16編碼,因此需要將GBK編碼轉(zhuǎn)換為UTF-8編碼,主要是為了避免出現(xiàn)亂碼的情況,這篇文章主要給大家介紹了關(guān)于Java字符轉(zhuǎn)碼之UTF-8互轉(zhuǎn)GBK具體實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-11-11關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析
這篇文章主要給大家介紹了關(guān)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09SpringBoot異常處理之異常顯示的頁(yè)面問(wèn)題
這篇文章主要介紹了SpringBoot異常處理異常顯示的頁(yè)面的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Java?KeyGenerator.generateKey的19個(gè)方法代碼示例
在下文中一共展示了KeyGenerator.generateKey方法的19個(gè)代碼示例,這些例子默認(rèn)根據(jù)受歡迎程度排序2021-12-12jsch中ChannelShell與ChannelExec的區(qū)別及說(shuō)明
這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07java正則表達(dá)式簡(jiǎn)單使用和網(wǎng)頁(yè)爬蟲(chóng)的制作代碼
java正則表達(dá)式簡(jiǎn)單使用和網(wǎng)頁(yè)爬蟲(chóng)的制作代碼,需要的朋友可以參考一下2013-05-05SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式
定時(shí)任務(wù)在我們項(xiàng)目開(kāi)發(fā)中也是很重要的,對(duì)于某些場(chǎng)景必須要用定時(shí)任務(wù)?,如定時(shí)發(fā)送郵件啊,定時(shí)統(tǒng)計(jì)數(shù)據(jù)等,這篇文章主要講講項(xiàng)目中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式,需要的朋友可以參考下2023-05-05