Scala 1.基礎
一、Scala簡介:多正規化的程式語言 1、多正規化:支援面向物件、支援函數語言程式設計 2、底層依賴JVM 二、安裝配置Scala、常用的開發工具 1、安裝配置 版本:2.11.8版本跟Spark的版本一致(spark-2.1.0-bin-hadoop2.7.tgz) scala-2.11.8.zip(Windows) scala-2.11.8.tgz(Linux) 以windows為例:類似JDK的安裝 (1)解壓: C:\Java\scala-2.11.8 (2)設定SCALA_HOME: C:\Java\scala-2.11.8 (3)把%SCALA_HOME%/bin加入PATH路徑 (4)執行: scala -version 2、常用開發工具 (1)REPL:命令列 退出: :quit (2)IDEA: 預設沒有Scala環境,安裝外掛SBT(需要聯網) (3)Scala IDE:就是Eclipse
三、Scala的常用資料型別 1、注意:在Scala中,任何資料都是物件。 舉例:數字 1 ----> 是一個物件,就有方法 scala> 1.toString res0: String = 1 ----> 定義了新的變數 res0,型別String 2、Scala定義變數的時候,可以不指定變數的型別,Scala會進行型別的自動推導 舉例:下面的語句是一樣的 var a:Int = 10 var b = 10 如何定義常量? val val c = 10 3、資料的型別 (1)數值型別:複習 (*)Byte: 8位的有符號 -128~127 (*)Short:16位的有符號 -32768 ~ 32767 (*)Int: 32位的有符號 (*)Long: 64位的有符號 (*)Float:浮點數 (*)Double:雙精度 (2)字串:Char、String 對於字串,在Scala中可以進行插值操作 val s1 = "hello world" 可以在另一個字串中,引用s1的值 "My name is Tom and ${s1}" (3)Unit型別:相當於Java中的void 型別 ()代表一個函式:沒有引數,也沒有返回值 scala> val f = () f: Unit = () val f = (a:Int) (4)Nothing型別:一般來說,表示在函式(方法)執行過程中產生了Exception 舉例: 定義函式 def def myfunction = throw new Exception("some exception ....") myfunction: Nothing 四、Scala的函式 1、內建函式:數學運算 舉例:求最大值 max(1,2) 包: import scala.math._
//迴圈 //for迴圈 //定義集合 var nameList = List("Mary","Mike","Tom") println("******第一種寫法******") // <- 表示提取符 for(s <- nameList) println(s) println("******第二種寫法******") //列印長度大於3的名字 //迴圈的時候加入判斷條件 for{ s <- nameList if(s.length > 3) }println(s) println("******第三種寫法******") for(s <- nameList if s.length <=3) println(s) //使用操作符(關鍵字)yield 使用迴圈的每個元素建立一個新的集合 //建立一個新的集合,名字大寫 var newNameList = for{ s <- nameList s1 = s.toUpperCase }yield(s1) //使用while 迴圈 var i = 0 while(i < nameList.length){ println(nameList(i)) //注意:小括號 i += 1 }
六、Scala函式的引數:求值策略 1、call by value:對函式的實參求值,並且僅求一次 舉例:def test1(x:Int,y:Int):Int = x+x 沒有用到y 2、call by name:函式的實參每次在函式體內部被呼叫的時候,都會進行求值 舉例:def test2(x: => Int,y: =>Int):Int = x+x 沒有用到y
3、一個複雜點的例子 x是call by value y是call by name def test3(x:Int,y: =>Int):Int = 1 再定義一個死迴圈的函式 def loop():Int = loop 考慮下面的兩個呼叫 test3(1,loop) ---> 正常 test3(loop,1) ---> 死迴圈 4、函式的引數:預設引數、代名引數、可變引數
//預設引數 def fun1(name:String="Mary"):String = "Hello " + name fun1("Tom") fun1() //代名引數:如果一個函式具有多個預設引數,使用帶名引數區別 def fun2(str:String="Good Morning ",name:String="Mary",age:Int=20) = str + name + " the age of " +name + " is " + age fun2(name="Mike") //可變引數:類似Java,Java中:... //Scala:使用 * //求任意個數字的和 def sum(args:Int*) = { var result = 0 for(arg <- args) result += arg //最後一句話就是返回值 result } //呼叫 sum(1,2,3) sum(1,2,3,4)
七、lazy值:如果一個變數被lazy修飾了,他的初始化會被推遲到第一次使用的時候 舉例1 scala> var x = 10 x: Int = 10
scala> lazy val y = x + 10 y: Int = <lazy>
scala> y res0: Int = 20 舉例2:讀檔案(存在) 讀檔案(不存在) scala> val words = scala.io.Source.fromFile("d:\\temp\\a.txt").mkString words: String = I love Beijing
scala> val words1 = scala.io.Source.fromFile("d:\\temp\\b.txt").mkString java.io.FileNotFoundException: d:\temp\b.txt (系統找不到指定的檔案。) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.<init>(FileInputStream.java:138) at scala.io.Source$.fromFile(Source.scala:91) at scala.io.Source$.fromFile(Source.scala:76) at scala.io.Source$.fromFile(Source.scala:54) ... 32 elided
scala> lazy val words1 = scala.io.Source.fromFile("d:\\temp\\b.txt").mkString words1: String = <lazy>
scala> words1 java.io.FileNotFoundException: d:\temp\b.txt (系統找不到指定的檔案。) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.<init>(FileInputStream.java:138) at scala.io.Source$.fromFile(Source.scala:91) at scala.io.Source$.fromFile(Source.scala:76) at scala.io.Source$.fromFile(Source.scala:54) at .words1$lzycompute(<console>:11) at .words1(<console>:11) ... 32 elided
scala>
參考 潭州學院 趙強老師scala 筆記