Scala2.11.7学习笔记(二)函数定义
魯春利的工作筆記,好記性不讓爛筆頭
函數定義
def 函數名(參數列表) : 返回類型 = {函數體}
說明:
????返回類型默認為空(Unit,類似于Java的void);
????函數體中默認最后一行為該函數的返回值;
????函數如果有返回值,則=號是必須的,否則可以省略等號;
????如果函數有返回值但返回類型指定為Unit,則任然無返回值;
????函數體中是不建議使用return語句的,但如果出現了return語句,則必須指定返回類型。
1、無返回值的函數舉例
package?com.lucl.scala/***?@author?lucl*/ object?ClassWithUnitFunc?{def?sayHi?(name?:?String)?{????//?無返回值,=號被省略println("hello,?"?+?name);}def?main?(args?:?Array[String])?{sayHi("luchunli");????//?hello,?luchunliprintln("sayHi?return?,?"?+?sayHi("luchunli"));????//?sayHi?return?,?()} }????說明:Unit為無返回值,調用時返回()
2、有返回值的函數舉例
package?com.lucl.scala/***?@author?lucl*/ object?ClassWithReturnValFunc?{def?sayBye?(name?:?String)?{"bye,?"?+?name;}def?sayOk?(name?:?String)?=?{"ok,?"?+?name;}//?有return必須給定返回類型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、方法調用
????無參方法調用時可以省略括號;
????有參方法調用時必須帶括號及參數。
4、默認參數
有些情況下我們不需要給出全部參數,可以使用默認參數,但需要知道參數順序或者參數名稱。
5、變長參數
實現一個可以接受可變長度的參數列表的函數。
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編譯器不能推斷遞歸函數的返回類型,必須給定。def?sum2(args?:?Int*)?:?Int?=?{if(args.length?==?0?)?{0??}?else?{?//?序列的head是參數args的首個元素,而tail是所有其它的元素序列args.head?+?sum2(args.tail:?_*)?}}???????def?main(args?:?Array[String])?{vsum(1,?2,?3,?4,?5);//?實現一個序列作為參數傳入,需要追加?_*,告訴編譯器希望把這個參數當做序列處理。如:vsum(1?to?5?:?_*);????//?將1到5當做參數序列處理sayHi("luchunli",?"zhangsan",?"lisi");//?println(sum2(1?to?5?:?_*));????//?15} }????實際上Java中也支持這種動態參數:
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、局部函數
實際上就是在函數里面再定義一個函數。
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);}//?定義局部函數,只在當前函數范圍內有效def?processLine?(x?:?String)?{if?(null?==?x?||?"".equals(x.trim))?{??//?去掉空行//?...}if?((x?indexOf?"*")?!=?-1)?{???????????//?去掉無效的數據行//?......}println("Line?:?"?+?x);}}def?main(args?:?Array[String])?{processFile();} }7、匿名函數
Scala把函數當作內置的值,也就是說函數可以放進var或val中,并和其他任何值所受的對待毫無二致,被稱為函數字面值或匿名函數。
定義函數字面值,關鍵是箭頭=>,定義格式如下:
(函數參數列表) => {作為代碼塊的函數體}
package?com.lucl.scala/***?@author?luchunli*/ object?FuncOfAnonymity?{//?省略代碼塊的{}var?doubler?=?(x?:?Int)?=>?x?*?2;//?匿名函數傳入n之后得到的仍然是個匿名函數//?即函數的函數,接收一個值并返回一個新的函數字面值:val?adder?=?(n?:?Int)?=>?{(x?:?Int)?=>?x?+?n;?}//?無參匿名函數var?noParam?=?()?=>?println("Hello?World!");//?函數作為參數,格式為def?函數名(函數名:(參數類型,?參數類型,?...)?=>?返回值,?其他參數)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);??????//?獲得一個函數println(plug(2));?????????//?5noParam();????????????????//?Hello?World!,而noParam表示的為()val?add?=?(a?:?Int,?b?:?Int)?=>?a?+?b;processNum(add,?2,?3);??} }轉載于:https://blog.51cto.com/luchunli/1704071
總結
以上是生活随笔為你收集整理的Scala2.11.7学习笔记(二)函数定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀平板8如何隐藏指定软件应用 荣耀平板
- 下一篇: Powershell 比较AD和Exch