scala初学之Tuple、Array、Map、文件操作入门实战
生活随笔
收集整理的這篇文章主要介紹了
scala初学之Tuple、Array、Map、文件操作入门实战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
特此聲明,本文中的代碼 部分或全部來源王家林的scala教程;雖然王家林一直被大家所詬病,而且也無法確定這些scala的程序代碼是不是他的。但是作為一個初學者覺得就算代碼不是他的,他只是拿過來翻譯一次,看他的視頻也是能了解一些東西的;但是很多東西講的確實欠缺;所以在學習的過程中把自己的很多思考注釋到了他的代碼中。一是當作自己的備忘,二也希望能夠給大家帶來一些些的幫助。
?
?
/*** @author user*tuple 這個東西我最初接觸實在storm中,在storm中消息都被封裝在tuple中,* 后來發現在python中也有tuple* 可見tuple已經被廣泛的作為一種數據結構被使用了* 其實tuple的實質很簡單,就是一組數據的組合,累死于object數組 * */ object TupleOps {def main(args:Array[String]):Unit={/*定義一個triple的tuple變量 在sacla中定義一個tuple只需要用()把你要放的一堆數據放進去,然后用逗號分割就可以了* 在這里,定義了一個有三個元素的tuple,第一個是100(整數),第二個是SCALA(字符串),第三個是0.2(Double)* 在開始說tuple和Object數組類似,但是在scala中,你把鼠標放在triple變量上的時候會顯示:* val triple : (Int,String,Double) 而不是 val triple : (Object,Object,Object)* 說明scala已經通過類型推導確定了triple中三個值的類型;這也就讓我們在使用tuple的時候,每一個值都能有了明確的類型,不用去類型轉換了。* */val triple = (100,"SCALA",0.2)/*分別輸出triple中的第一個,第二個,第三個值*/println(triple._1)println(triple._2)println(triple._3)/*延伸一下下* 我們可以定義一個匿名的tuple 就像下面那樣 val(a,v,_)=triple* 這樣,我們不知這個tuple的具體名字,卻知道tuple中的值的名字,所以可以直接使用a和v* 在下面就在println中使用了a和v來打印匿名tuple中的第一個和第二個值* 最后一個是_,這個_表示我不關心這個值的名稱,可以有任意多個;(只要你不想關心的tuple中的某個值,就給他取名字叫_)* 這樣在下面的方法中就無法使用了。 _的出現的最主要的原因是你接收值的tuple的值的個數必須和給這個tuple返回的賦值* tuple的值的個數相同。 就如同下面,返回了三個值,我不關心第三個,但是又必須在()里面有三個值的名稱,可是我只用* 兩個,第三個起個名字還要費腦子啊--所以_就是最佳的選擇了。* */val (a,v,_) =tripleprintln(a)println(v)} }?
?
?
?
?
?
/*** * 在scala中失去了String x [] = new String[10];這樣定義數組的機會* 所有的數組都封裝成了Array對象來使用* * */def main(args:Array[String]):Unit={/*定義一個Array,初始序列位1,2,3,4,5 * 這里直接寫 val array = Array(1,2,3,4,5)* 其實用到了Array類的伴生對象* 具體來說,就是我們定義了一個class Array //(1) 然后定義一個 object Array //(2)* 那么(2)就是(1)的伴生對象* 在伴生對象中可以定義一個apply(.....這里的參數由自己定義)方法* 這個apply一般就是在伴生對象中區初始化一個類的對象* 也就是在(2)中通過apply來初始化一個(1)的具體對象* 所以可以有 val array = Array.apply(1,2,3,4,5)* 然后scala做了優化,就變成了Array(1,2,3,4,5)就是調用apply方法 * *//*鼠標放到array上面,可以看到array的類型 val array:Array[Int]*/val array = Array(1,2,3,4,5)/*由上面可以知道,我們這樣寫也是正確的 在這里我們指明了 array_1是一個數組 并且數組內的元素都是Int*/val array_1:Array[Int] = Array(6,7,8,9,10)/*所以 下面這樣是錯的 因為根本就不是array*///val array_2:Array =2/*下面這樣也是錯的 因為數組元素不對應*///val array_3:Array[Int]=Array("1","2")/*要獲得數組中的某個元素,直接使用 .apply(index) 方法*/println(array_1.apply(2))/*apply方法可以簡寫為 */println(array_1(2))/*在scala中,的Array是不變量 也就是所一旦被創建,那么大小,內容就都不會改變了* 所以我們無法改變Array的長度以及內容* *//*但是在scala中還是提供了 .+: 這樣的方法,這個方法允許我們把當前array的數組元素的超類和當前array的全部元素* 合并為一個新的array并返回*/val array_x=array.+:(10) //生成了一個新的數組,以前的array還是那個array沒有任何改變;array_x的內容位 10,1,2,3,4,5/*同時可以直接和一個數組合并,生成一個新的數組*/val array_y=array.++:(array_1) //array_y的內容位 6,7,8,9,10,1,2,3,4,5 都是在前面插入/*也可以通過new的方式來創建 在創建的時候指定了泛型的類型 和數組的長度 長度是必須指定的,泛型不寫就是Nothing,具體效果還沒有研究過)*//*但是Array默認是不可改變的,所以個人感覺這樣來創建Array的意義不大。 后面會有可變的Array*/val arr0:Array[String] =new Array(10)val arr1 =new Array[String](10)/*for循環來遍歷數組*/for(i <- 0 until array.length){println(array(i))}/*增強for循環*/for(elem <- array) println(elem)} }?
?
?
?
?
?
import scala.collection.Map import scala.collection.immutable.HashMapobject MapOperations {def main(args:Array[String]):Unit={/** 在scala中,定義一個Map和Array差不多* 這里也是使用Map類的伴生對象來創建ages* 其原理也是調用Map伴生對象中的apply方法來實例化* * Map的很多方面和Array很相似,* *//*這里在初始化的時候,要同時放入key和value* 在scal中就使用 key->value來表示一個key value對* */val ages =Map("Rocky"->27,"Spark"->5)val agess=Map("LL"->2,"PP"->3)val ages1=ages.+(("S",2))//返回一個新的Map 新的Map中包含了ages的所有元素和 "S"->2val ages2=ages.++:(agess)//返回一個新的Map 新的Map中包含了ages和agess的所有元素/*通過for循環來遍歷Map* 不得不說scala確實簡化了好多操作* 在java中要遍歷一個map是這樣的* for(Entry<String, String> en:new HashMap<String,String>().entrySet()){* ......................* }* 在scala中只需要 (k,v) <-ages 就可以了* (k,v)是一個匿名的tuple,前面說過 可見ages的迭代返回tuple 第一個是key 第二個是value* */for((k,v) <-ages){println("Key is : "+k+" Value is : "+v)}println("----------------------------------------------")for((k,_) <-ages){//同樣的,如果我們只關心key,那么v可以用_來代替println("Key is : "+k)}} }?
import scala.io.Sourceobject FileOps {/*** 這里其實沒什么內容,就是Source的兩個方法* 一個從本地讀,一個從網址讀* 而且用起來真的很爽,不用關心異常,不用去關閉流···* * */def main(args:Array[String]):Unit={/*只要記住Source就是要操作的資源 要從文件取,就fromFile 要從網址取就fromURL*/val file = Source.fromFile("E:\\test.txt")val urlFile=Source.fromURL("http://spark.apache.org/")for(line <- file.getLines()){//通過for循環來一行一行的輸出 file.getLines()返回一個文件內容的按行迭代println(line)}for(line <- urlFile.getLines()){//同上println(line)}} }?
?
?
?
?
總結
以上是生活随笔為你收集整理的scala初学之Tuple、Array、Map、文件操作入门实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用QuickCHM软件轻松编译CHM格
- 下一篇: PDF N-Up Maker:一个把PD