日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scala2.11.7学习笔记(二)函数定义

發布時間:2023/12/31 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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、方法調用

????無參方法調用時可以省略括號;

????有參方法調用時必須帶括號及參數。

package?com.lucl.scala/***?@author?luchunli*/ object?FuncTest?{//?無參函數def?greet?()?{println("greet");}//?有參函數def?hello?(name?:?String)?{println("hello,?"??+?name);}//?函數只有一條語句,{}也可以省略def?goodbye?=?println("good?bye");????????def?main?(args?:?Array[String])?{greet;??????????????????????//?無參函數調用時可以省略()greet();????????????????????//?hello("luchunli");??????????//?有參函數不可省略println(greet()?==?());?????//?truegoodbye;????????????????????//?good?bye} }


4、默認參數

有些情況下我們不需要給出全部參數,可以使用默認參數,但需要知道參數順序或者參數名稱。

package?com.lucl.scala/***?@author?luchunli*/ object?FuncDefaultArguments?{def?sayHi?(word?:?String,?name?:?String?=?"luchunli")?{println(word?+?",?"?+?name);}def?main?(args?:?Array[String])?{sayHi("hello");????????????????//?hello,?luchunli//?通過名稱指定參數sayHi(word="hello");???????????//?hello,?luchunlisayHi(word="hi",?"zhangsan");??//?hi,?zhangsan} }


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学习笔记(二)函数定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。