Scala入門

Scala是基於JVM的一門編程語言,使用字節碼文件在JVM上運行,能夠與JAVA代碼無縫調用。
Scala是Spark的編程語言,看源碼和編寫Spark處理程序會用到。html

安裝

Ctrl+Shift+P
輸入:package,選擇package control:package Install。
輸入:repl,選擇sublimeREPL
Tools -> SublimeREPL -> Scala

基本

分行符;

可使用;做爲行結束,也能夠不使用,可是在一行須要多條語句時候須要使用java

塊表達式{},做爲一個表達式是有值的(其實就是省略了return)

能夠像JAVA同樣使用{}包含代碼塊,包含的部分做爲塊執行,最後一個語句的值做爲塊表達式的返回值python

var d = if(a<10){b = b + 1;c+1}
//至關於,最後一行做爲返回值
var d = if(a<10){
    b = b + 1
    c = c + 1
}

註釋與JAVA相同

縮進問題:與Python不一樣,不是靠縮進實現代碼塊的

var d = if(a<10)
    b = b + 1
    c = c + 1//這一行被當作新的一條語句來執行

Hello world

REPL:(Read Evaluation Print Loop)Scala解釋器會快速編譯成字節碼文件,提交給JVM執行而後返回結果。

計算表達式:直接輸入計算表達式,Scala會像Python同樣直接返回計算結果,若是你沒有定義一個變量來接收,將使用內置變量res1:Int = 來打印變量和類型

scala> 1+1
res1: Int = 2

內置變量:上文的變量是能夠直接調用的

scala> 1+res2
res3: Int = 3

使用tab自動補全

變量

val變量(常量,不可改變)推薦使用

val result = 1 + 1

var變量(正常的變量)

在Spark編程中,一般建議使用val來聲明,防止在複雜的大數據系統中值被錯誤的更改
在JAVA中這種大型複雜系統開發中,一樣用了相似的特性,如不可變類(Immuable class),裏面的變量使用final定義,從而提高系統的健壯性(robust魯棒性)編程

var res = 2

指定類型(用於使用父類的類型來包容更小的類型)

Scala在聲明變量時候能夠指定類型,如不聲明,scala會根據值自動判斷類型app

var name:String = "hello"
var name:Any = 123

多個變量聲明

//錯誤
var i1,i2 = 1,2
var i1 = 1,i2 = 2

//正確
var i1,i2 = 100

數據類型

基本數據類型:Byte Char Short Int Long Float Double Boolean

scala中,沒有基本數據類型和包裝數據類型的區別,都是類。全都擁有方法。對於底層的數據類型和引用類型的轉換自動完成jvm

1.toString
1.toString()

增強版數據類型:StingOps RichInt RichDouble RichChar使用這些加強類來增長基本數據類型的功能或函數。然而這一切都是自動完成

1.to(10)
res0: scala.collection.immutable.Range.Inclusive = Range 1 to 10

操做符:在scala中的操做符其實也是函數,函數也能作操做符

支持 += -= 但不支持 -- ++編程語言

1 + 1       等於  1.+(1)
1.to(10)    等於  1 to 10

函數

函數調用:須要傳參數才須要括號,不須要參數能夠省略括號

max(1,2)
"Hello".toUpperCase

apply函數:使用 類名()便可實例化對象,實際上至關於調用了類名.apply(),咱們須要在類中def apply():

//實例化對象:
Array(1,2,3,4)
//至關於調用了,StingOps類中的apply方法
Array.apply(1,2,3,4)
res0: Array[Int] = Array(1, 2, 3, 4)

條件控制及循環

IF

有值的if表達式

//將會返回if/else最後的值做爲表達式的值(感受就是省略了return語句)
val age = 30;
var isAdult = if (age > 18) 1 else 0

//另外一種寫法(不經常使用)
var isAdult = -1;if (age > 18) isAdult = 1 else isAdult = 0

返回值類型

//if和else中返回值類型不一樣時,返回值類型取兩種類型的**父類型**
age = 30;if (age > 18) "adult" else 0
res0: Any = adult

//當else語句不存在時,默認else的類型爲**Unit**也用**()**表示,至關於Java中的null
age = 30;if (age < 18) "adult" 
res0: AnyVal = ()

多行可使用{}/:paste進入粘貼模式(無需{})

循環

while do 循環

var n = 10 while (n > 0) {
  print(n + " ")
  n -= 1 
}

Scala沒有正兒八經的for循環

// 1.簡易for循環
for (i <- 1 to 10){
  println(i)
}
//1 to 10:Range(1,2,3,4,5,6,7,8,9,10)

// 2.使用until忽略上界限
for(i <- 1 until 10){
    println(i)
}
//1 until 10:Range(1,2,3,4,5,6,7,8,9)

// 3.加強for循環(更體現面向對象)
for(i <- "Hello world"){
    print(i+" ")
}

高級for循環

循環嵌套ide

for (i <- 1 to 9; j <- 1 to 9) {
    printf("i=%d j=%d\n",i,j)
    //這樣就實現了循環嵌套,總共執行4*4次
}
//結果以下
i=1 j=1
i=1 j=2
i=1 j=3
i=1 j=4
i=2 j=1
i=2 j=2
i=2 j=3
i=2 j=4
...

//徹底等效的JAVA代碼
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        System.out.println("i=" + i + "j=" + j + "\n");
    }
}

if守衛函數

for(i <- 1 to 100 if i % 2 == 0){
    println(i)
}

for推導式oop

for(i<- 1 to 10) yield i
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

跳出for循環(!!喪心病狂!!)

import scala.util.control.Breaks

val mybreaks = new Breaks

import mybreaks.{break, breakable}

breakable {
  var n = 10
  for (c <- "Helloworld") {
    print(c + " ")
    if (n == 5 ) break()
    n -= 1
  }
}

輸入輸出

// use java API
System.out.print("ABC")
System.out.println("ABC")

// Use scala API
print("ABC")
print("ABC")

// printf %s %d 必須使用print
printf("My name is %s,I'm %d yesrs old","James",20) 

// input from Terminal
readLine("This will show in Terminal and wait for you input")           //棄用
readInt()           //將會強轉爲Int

import scala.io.StdIn       //新標準
readf("This is a new read in method")
相關文章
相關標籤/搜索