Scala入門詳解(一)
簡介
Scala是一種多正規化的程式語言,其設計的初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。Scala運行於Java平臺(Java虛擬機器),併兼容現有的Java程式。
優點
- 優雅:這是框架設計師第一個要考慮的問題,框架的使用者是應用開發程式設計師,API是否優雅直接影響使用者體驗。
- 速度快:Scala語言表達能力強,一行程式碼抵得上Java多行,開發速度快;Scala是靜態編譯的。
- 能融合到hadoop生態圈:Hadoop現在是大資料事實標準,Spark並不是要取代Hadoop,而是要完善Hadoop生態。JVM語言大部分可能會想到Java,但Java做出來的API太醜,或者想實現一個優雅的API太費勁。
Scala常識
-
約定
object:指scala中的特殊的單例物件,注意不要把object翻譯成物件,以
免衝突
物件:指new關鍵字所建立的例項,和java中的物件指代同一事物
類 :和java語言指代一樣
方法:和java語言指代一樣,也可以叫操作
函式:指的是某種特殊的例項,與方法不能混為一談
特質:類似java介面,但比介面強大
欄位:也叫屬性 -
程式設計規範
區分大小寫:Scala是大小寫敏感的,這意味著標識Hello和hello在Scala中會有不同的含義。識別符號:Scala可以使用兩種形式的標誌符,字元數字和符號。字元數字使用字母或是下劃線開頭,後面可以接字母或是數字,符號"“開頭的識別符號為保留的 Scala 編譯器產生的標誌符使用,應用程式應該避免使用”$"開始的識別符號,以免造成衝突。
類名:對於所有的類名的第一個字母要大寫。如果需要使用幾個單詞來構成一個類的名稱,每個單詞的第一個字母要大寫。
示例:class MyFirstScalaClass方法名稱:所有的方法名稱的第一個字母用小寫。
如果若干單詞被用於構成方法的名稱,則每個單詞的第一個字母應大寫。
示例:def myMethodName()程式檔名:程式檔案的名稱應該與物件名稱完全匹配。
儲存檔案時,應該儲存它使用的物件名稱(記住Scala是區分大小寫),並追加".scala"為副檔名。(如果檔名和物件名稱不匹配也可以)。程式碼語句分割:scala語句分割是英文分號(;)或換行,一條語句單獨佔一行時可省略分號,多條語句在一行時語句與語句之間的分號不可省略,
如: [1] val str = “scala 簡學 ”; println(str)
[2] val hello = “Hello Scala”
[3] println(hello) -
程式入口
和其他語言一樣,main方法都是作業系統排程執行時的執行入口,其為固定寫
法:
object HelloScala {
def main(args: Array[String]): Unit = {
//edit your code
}
}
注:main方法必須在單例物件object中
- App特質
在 Scala中有一個特殊的特質,即App特質,一個預先定義好了main方法的特質,因此一個繼承了App特質的object程式碼不需要主方法也可執行
Scala基礎
資料型別
Scala 中的面向物件更徹底,在 scala 語言的世界中,萬物皆物件。其中最顯著的就
是摒棄了基本資料型別(語法上),即放棄加減乘除等這些操作,取而代之的是加減乘除
方法。Scala 中的類層次結構圖如下:
包操作
- 定義包
- 第一種:和Java一樣,在檔案頭定義包名,後續所有程式碼都放在
該包中。package com.runoob class HelloWorld
- 第二種:類似C#, 可以在一個檔案中定義多個包。
package com.runoob { class HelloWorld }
- 第一種:和Java一樣,在檔案頭定義包名,後續所有程式碼都放在
- 引用包
和Java一樣使用import關鍵字匯入包import java.awt.Color // 引入 Color import java.awt._ // 引入包內所有成員, import java.awt.{Color, Font} import java.util.{HashMap => JavaHashMap}// 重新命名成員 // 引入了 util 包的所有成員,但是 HashMap 被隱藏了 import java.util.{HashMap => _, _}
宣告變數
object VariableDemo {
def main(args: Array[String]) {
//使用val定義的變數值是不可變的,相當於java裡用final修飾的變數
val i = 1
//使用var定義的變數是可變的,在Scala中鼓勵使用val
var s = "hello"
//Scala編譯器會自動推斷變數的型別,必要的時候可以指定型別
//變數名在前,型別在後
val str: String = "world"
}
}
條件表示式
object ConditionDemo {
def main(args: Array[String]) {
val x = 1
//判斷x的值,將結果賦給y
val y = if (x > 0) 1 else -1
//列印y的值
println(y)
//支援混合型別表示式
val z = if (x > 1) 1 else "error"
//列印z的值
println(z)
//如果缺失else,相當於if (x > 2) 1 else ()
val m = if (x > 2) 1
println(m)
//在scala中每個表示式都有值,scala中有個Unit類,寫做(),相當於Java中的void
val n = if (x > 2) 1 else ()
println(n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println(k)
}
}
迴圈表示式
在scala中有for迴圈和while迴圈,用for迴圈比較多,while迴圈和java的一樣
object TestFor {
def main(args: Array[String]): Unit = {
// i to j 語法(包含j)[i,j]
// 可設定步長,預設為1
println("to語法:")
for (i <- 1 to (10,2)){
println(i)
}
// i until j 語法(不包含j)[i,j)
println("until語法:")
for (i <- 1 until 10){
println(i)
}
// 使用分號 (;) 來設定多個區間,它將迭代給定區間所有的可能值
println("多個區間:")
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
// 遍歷集合元素
println("遍歷集合元素:")
var list = List(1,2,3,4,5)
for (i <- list){
println(i)
}
// 迴圈過濾,使用分號(;)來為表示式新增一個或多個的過濾條件
println("迴圈過濾:")
for (i <- list if i != 3; if i > 2){
println(i)
}
// 使用yield將for迴圈的返回值作為一個變數儲存
println("yield:")
var tem = for { i <- list if i != 3 if i > 2 }yield -i*2
// 相當於
var tem2 = list.filter(_ != 3).filter(_ > 2).map(_ * -2)
for (i <- tem2){
println(i)
}
}
}