scala初学之函数定义、流程控制、异常处理入门
生活随笔
收集整理的這篇文章主要介紹了
scala初学之函数定义、流程控制、异常处理入门
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
特此聲明,本文中的代碼 部分或全部來源王家林的scala教程;雖然王家林一直被大家所詬病,而且也無法確定這些scala的程序代碼是不是他的。但是作為一個初學者覺得就算代碼不是他的,他只是拿過來翻譯一次,看他的視頻也是能了解一些東西的;但是很多東西講的確實欠缺;所以在學習的過程中把自己的很多思考注釋到了他的代碼中。一是當作自己的備忘,二也希望能夠給大家?guī)硪恍┬┑膸椭?/p>
?
進入正文:
?
?
package com.dt.scala.hello/**** 這是第二集視頻中的代碼* 主要將函數(shù)的定義、函數(shù)的調(diào)用、if判斷、循環(huán)和控制、異常處理、靜態(tài)代碼塊 ** */ object ScalaBasics {//在object中所有的一切都是靜態(tài)的(包括方法和代碼塊)//1.方法的定義//1.1無參方法的定義/*def就是用來定義方法的 ;doWhile是方法的名稱;Unit是返回類型,相當于java中的void */def doWhile(): Unit={/** 這是一種完全的寫法,下面的寫法也是正確的* * def doWhile(){}* def doWhile()={}* def doWhile{}* def doWhile={}* def doWhile:Unit={}* * 但是這種定義是不正確的* def doWhile():Unit{}* * 為什么可以省略返回值類型呢?因為scala會把最后一行的變量或者運行結(jié)果當作返回值,那么返回值的類型也就由* scala的類型推斷機制來完成了 (Unit也是一種變量類型和運行結(jié)果)* *///又想起了scala中一個語句后面是不需要寫那個;號的,其實挺爽的,寫上一萬行代碼就少敲一萬下鍵盤不是么var line = "" //這里定義了一個var 類型的變量 這里用var的話,就是說這個line變量可以被多次賦值//也就是說,我寫了line = "123";line = "456";這樣的多次賦值是可以被接受的。//在java中我們定義一個字符串的時候是這樣的 String line = "";這個line在java中也可以被無數(shù)次的賦值//其實嚴格的說scala中我們定義一個字符串的話應該這樣來寫 var line:String =""//但是我們卻可以直接寫成 var line =""//主要因為兩點 第一、scala中的變量必須初始化 第二、scala中提供了自動的類型轉(zhuǎn)換 //首先來說第一點,我們在java中這樣寫 String line;是正確的。但是在scala中如果寫 //var line:String 錯誤//var line 錯誤//var line:String;錯誤//var line;錯誤//只有var line:String="" 和 var line=""是正確的//第二點 scala中體中了自動類型轉(zhuǎn)換,也就是說 由于我的變量必須賦值,那么變量的類型完全可以又變量的值來推出//因此 var line:String=""也就變成了var line = "" 不得不說又少敲鍵盤了/**********************************************************************************************//*和var相對立的還有一個 叫val的標識符,和var一樣,val也必須初始化,也可以省略掉變量的類型* 唯一不同地方就是 val 標識的變量初始化以后是不可再賦值的 相當于java中在變量前加上了final關(guān)鍵字一樣* 例如 val line = "" ;然后再賦值 line="123"就會報錯 ;如同java中的 final String line ="";一樣* 在scala中更加鼓勵使用val來定義變量,(個人理解,這個對于減少方法的副作用有幫助,同時有利于多線程和函數(shù)式編程)* */do{//和java中的do-while循環(huán)是一樣的line=readLine()//相當于java中的new Scanner(System.in).nextLine(); 這個readLine在scala。Predef包中,scala默認引入該包//其功能就是讀入一行用戶的輸入并賦值給line//也可以簡寫為 line = readLineprintln("Read: " + line)//輸出 相當于java中的System.out.println(-------);}while(line != "")//循環(huán)條件為line不是空字符串}//調(diào)用見main函數(shù)中的1.1//1.2 帶參數(shù)和返回值的方法的定義// def用來定義函數(shù) looper函數(shù)名 x:Long,y:Long 兩個Long類型的參數(shù) ):Long 返回值類型def looper(x : Long,y :Long): Long={/*關(guān)于方法簽名的各種省略寫法和doWhile是一致的*/var a=xvar b=y//分別把x和y賦值給了var類型的a和b//因為下邊要在循環(huán)中不停的修改a和b的值所以是var來定義//那為什么不直接操作x和y呢//因為x和y都是val類型的, 也就是所在scala的所有方法中參數(shù)都是val類型的也就是說如果用java來描述這個函數(shù)的話應該是這樣// public static Long looper(final Long x,final Long y){}//在java的代碼重構(gòu)中提到針對與函數(shù)的變量的賦值是一種代碼的壞味道,可能會引起代碼的副作用//val對于多線程的處理意義重大,大家可以百度while(a!=0){//這就是個循環(huán)了 while循環(huán)var temp=aa=b%ab=temp}b//···一個孤零零的b變量,直接作為了返回值 樂意的話加上 return也可以 }//函數(shù)調(diào)用劍main中的1.2def main(args: Array[String]): Unit = {//1.1doWhile //調(diào)用doWhile函數(shù) 當然寫成doWhile()也是正確的,這里又是簡寫了//1.2println(looper(100,298))//直接輸出函數(shù)的調(diào)用結(jié)果//2 if語句//2.1 scala中的if判斷var file = "scala.txt"if(!args.isEmpty) file=args(0)//如果傳入的參數(shù)不為空,賦值為args(0)//2.2 對2.1的簡寫var fileo = if(!args.isEmpty) args(0) else "scala.txt"//看起來挺新鮮,其實就是java中的 String x = !args.isEmpty()?args(0):"scala.txt";/*兩個輸出 沒啥好說的*/ println(fileo)println(file)//3 for循環(huán)//3.1for(i <- 1 to 10){//在java中我們寫for(int i=1;i<=10;i++)//首先看看這個 1 to 10 其實是一個語法糖,在scala中做到了一切皆對象,//所以你寫個 1 我去這也是一個對象(scala會通過隱士轉(zhuǎn)化的方式把你的1轉(zhuǎn)換為一個RichInt對象)//所以呢 to就是1的一個方法 本尊應該這樣寫 1.to(10) 這個方法返回一個Range··也就是一個java中的list的意思//所以 <- 這個東西就是 把 1.to(10) 的返回值依次賦給i然后進入循環(huán)體中運行println("Number is:" +i)}//3.2 由3.1的分析可以知道 這樣寫也是對的for(i <- 1.to(10)){println("Number is:" +i)}//3.3 scala中的增強for循環(huán) 相當于java中的for(String x:list){}val files= (new java.io.File(".")).listFiles()//這句不用管,就是返回當前目錄下的所有文件的一個Array對象for(file <-files){//把files依次賦值給file,進入循環(huán)體中運行//我覺得這個就不要說什么增強的for了//因為2.1可以這樣寫啊//val test=1 to 10//for(i <- test){//println("Number is:" +i)//}//所以只不過是把list的獲得放在for()在外和之內(nèi)的區(qū)別,沒有像王某說的還有個增強for循環(huán)println(file)}//4 初次接觸scala中的異常處理val n = 99try {//和java一樣,使用try catch finally 結(jié)構(gòu)來做異常處理 ;唯一的改變就是在catch處//拋出一個運行時異常val half =if(n%2==0) n/2 else throw new RuntimeException("n must be even")}catch{//在java中是//catch(xxxxException e){}//..........//catch(Exception e){}//為了處理異常我們會寫一檔對的catch函數(shù),然后在不同的catch函數(shù)中針對特定的異常進行處理//在scala中直接省去了對異常的傳入,而且永遠只有一個catch了//針對不同的catch我們可以這樣寫//catch{//case e:xxxxException => doSomeThing//...//case e:Exception => doSomeThing//}//這樣寫比起java中的一堆堆看起來要舒心了很多啊//case 用來作為一個分支判斷 e:Exception 用來指定異常的類型 是case的判斷條件 如果 也就是如果//e匹配Exception類型,那么 => 指向了要執(zhí)行的操作case e:Exception => println("The Exception is : "+e.getMessage())}finally{//和java中的finally的作用相同}}//靜態(tài)代碼塊 由于在object中所有的所有都是靜態(tài)的,所以包括一個語句都是靜態(tài)的//java中的static{...}在類加載的時候就會執(zhí)行//這里的三行代碼也是一樣的,他們沒有包含在任何的方法體中,會在代碼加載的時候執(zhí)行 而且是在main函數(shù)調(diào)用之前執(zhí)行var line=""line=readLine()println("Read_Out: " + line) }?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的scala初学之函数定义、流程控制、异常处理入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net 实现 URL重写,伪静态
- 下一篇: 关于vs2008设计视图假死的原因及解决