1. 程式人生 > >Scala 1.基礎

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._

        https://www.scala-lang.org/files/archive/api/2.11.8/#package                  scala> max(1,2)         res4: Int = 2  ----> 定義了一個新的變數來儲存運算的結果                  var result:Int = max(1,2)         var result = max(1,2)          2、自定義函式:def                       3、Scala的條件表示式 if.. else         //注意:scala中函式的最後一句話,就是函式分返回值         //不寫reture                  五、迴圈: for、while、do...while

//迴圈
//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 筆記