Scala2.11.7学习笔记(二)函数定义
魯春利的工作筆記,好記性不讓爛筆頭
函數(shù)定義
def 函數(shù)名(參數(shù)列表) : 返回類(lèi)型 = {函數(shù)體}
說(shuō)明:
????返回類(lèi)型默認(rèn)為空(Unit,類(lèi)似于Java的void);
????函數(shù)體中默認(rèn)最后一行為該函數(shù)的返回值;
????函數(shù)如果有返回值,則=號(hào)是必須的,否則可以省略等號(hào);
????如果函數(shù)有返回值但返回類(lèi)型指定為Unit,則任然無(wú)返回值;
????函數(shù)體中是不建議使用return語(yǔ)句的,但如果出現(xiàn)了return語(yǔ)句,則必須指定返回類(lèi)型。
1、無(wú)返回值的函數(shù)舉例
package?com.lucl.scala/***?@author?lucl*/ object?ClassWithUnitFunc?{def?sayHi?(name?:?String)?{????//?無(wú)返回值,=號(hào)被省略println("hello,?"?+?name);}def?main?(args?:?Array[String])?{sayHi("luchunli");????//?hello,?luchunliprintln("sayHi?return?,?"?+?sayHi("luchunli"));????//?sayHi?return?,?()} }????說(shuō)明:Unit為無(wú)返回值,調(diào)用時(shí)返回()
2、有返回值的函數(shù)舉例
package?com.lucl.scala/***?@author?lucl*/ object?ClassWithReturnValFunc?{def?sayBye?(name?:?String)?{"bye,?"?+?name;}def?sayOk?(name?:?String)?=?{"ok,?"?+?name;}//?有return必須給定返回類(lèi)型def?sayGood?(name?:?String)?:?String?=?{//?method?sayGood?has?return?statement;?needs?result?typereturn?"good,?"?+?name;}def?main?(args?:?Array[String])?{println(sayBye("luchunli"));????//?()println(sayOk("luchunli"));????//?ok,?luchunliprintln(sayGood("luchunli"));????//?good,?luchunli} }3、方法調(diào)用
????無(wú)參方法調(diào)用時(shí)可以省略括號(hào);
????有參方法調(diào)用時(shí)必須帶括號(hào)及參數(shù)。
4、默認(rèn)參數(shù)
有些情況下我們不需要給出全部參數(shù),可以使用默認(rèn)參數(shù),但需要知道參數(shù)順序或者參數(shù)名稱。
5、變長(zhǎng)參數(shù)
實(shí)現(xiàn)一個(gè)可以接受可變長(zhǎng)度的參數(shù)列表的函數(shù)。
package?com.lucl.scala/***?@author?lucl*/ object?FuncWithVarargs?{def?vsum?(args?:?Int*)?{var?result?=?0;for?(arg?<-?args)?{result?+=?arg;}println("The?result?"?+?result);????//?The?result?15}def?sayHi?(args?:?String*)?{print("Hi,?");args.foreach?{print};????//?luchunlizhangsanlisiprintln;}//?在遞歸中我們同樣可以使用這種方式,Scala編譯器不能推斷遞歸函數(shù)的返回類(lèi)型,必須給定。def?sum2(args?:?Int*)?:?Int?=?{if(args.length?==?0?)?{0??}?else?{?//?序列的head是參數(shù)args的首個(gè)元素,而tail是所有其它的元素序列args.head?+?sum2(args.tail:?_*)?}}???????def?main(args?:?Array[String])?{vsum(1,?2,?3,?4,?5);//?實(shí)現(xiàn)一個(gè)序列作為參數(shù)傳入,需要追加?_*,告訴編譯器希望把這個(gè)參數(shù)當(dāng)做序列處理。如:vsum(1?to?5?:?_*);????//?將1到5當(dāng)做參數(shù)序列處理sayHi("luchunli",?"zhangsan",?"lisi");//?println(sum2(1?to?5?:?_*));????//?15} }????實(shí)際上Java中也支持這種動(dòng)態(tài)參數(shù):
package?com.lucl.apps.web.sample; /***?@author?luchunli**/ public?class?JavaDynamicParams?{public?void?sayHi?(String?...params)?{for?(String?str?:?params)?{System.out.print(str?+?",?");????//?luchunli,?zhangsan,?lisi,?}System.out.println("");}//?public?static?void?main(String[]?args)?{JavaDynamicParams?dy?=?new?JavaDynamicParams();dy.sayHi("luchunli",?"zhangsan",?"lisi");}}6、局部函數(shù)
實(shí)際上就是在函數(shù)里面再定義一個(gè)函數(shù)。
package?com.lucl.scalaimport?scala.io.Source import?java.io.File/***?@author?luchunli*/ object?FuncWithPart?{def?processFile??()?{val?file?=?new?File("F:\\ftpfile\\ip.txt");var?source?=?Source.fromFile(file);for?(line?<-?source.getLines())?{processLine?(line);}//?定義局部函數(shù),只在當(dāng)前函數(shù)范圍內(nèi)有效def?processLine?(x?:?String)?{if?(null?==?x?||?"".equals(x.trim))?{??//?去掉空行//?...}if?((x?indexOf?"*")?!=?-1)?{???????????//?去掉無(wú)效的數(shù)據(jù)行//?......}println("Line?:?"?+?x);}}def?main(args?:?Array[String])?{processFile();} }7、匿名函數(shù)
Scala把函數(shù)當(dāng)作內(nèi)置的值,也就是說(shuō)函數(shù)可以放進(jìn)var或val中,并和其他任何值所受的對(duì)待毫無(wú)二致,被稱為函數(shù)字面值或匿名函數(shù)。
定義函數(shù)字面值,關(guān)鍵是箭頭=>,定義格式如下:
(函數(shù)參數(shù)列表) => {作為代碼塊的函數(shù)體}
package?com.lucl.scala/***?@author?luchunli*/ object?FuncOfAnonymity?{//?省略代碼塊的{}var?doubler?=?(x?:?Int)?=>?x?*?2;//?匿名函數(shù)傳入n之后得到的仍然是個(gè)匿名函數(shù)//?即函數(shù)的函數(shù),接收一個(gè)值并返回一個(gè)新的函數(shù)字面值:val?adder?=?(n?:?Int)?=>?{(x?:?Int)?=>?x?+?n;?}//?無(wú)參匿名函數(shù)var?noParam?=?()?=>?println("Hello?World!");//?函數(shù)作為參數(shù),格式為def?函數(shù)名(函數(shù)名:(參數(shù)類(lèi)型,?參數(shù)類(lèi)型,?...)?=>?返回值,?其他參數(shù))def?processNum?(f?:?(Int,?Int)?=>?Int,?m?:?Int,?n?:?Int)?{println(f?(m,?n));????????//?5}def?main?(args?:?Array[String])?{println(doubler(3));??????//?6println(adder(3));????????//?<function1>??var?plug?=?adder(3);??????//?獲得一個(gè)函數(shù)println(plug(2));?????????//?5noParam();????????????????//?Hello?World!,而noParam表示的為()val?add?=?(a?:?Int,?b?:?Int)?=>?a?+?b;processNum(add,?2,?3);??} }轉(zhuǎn)載于:https://blog.51cto.com/luchunli/1704071
總結(jié)
以上是生活随笔為你收集整理的Scala2.11.7学习笔记(二)函数定义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 荣耀平板8如何隐藏指定软件应用 荣耀平板
- 下一篇: Powershell 比较AD和Exch