簡介
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)
}
}
}